设计模式之《结构型模式》版块(基于Java) (9)

解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是 一个树形结构,可以更好的实现管理操作。 => 组合模式

组合模式基本介绍

组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。

组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

这种类型的设计模式属于结构型模式。

组合模式使得用户对单个对象和组合对象的访问具有一致性:组合能让客户以一致的方式处理个别对象以及组合对象

组合模式原理类图

设计模式之《结构型模式》版块(基于Java)

角色说明

Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component 子部件, Component 可以是抽象类或者接口

Leaf:在组合中表示叶子节点,叶子节点没有子节点

Composite:非叶子节点,用于存储子部件,在Component接口中实现子部件的相关操作,比如增删改查

组合模式解决学校院系展示 UML类图

设计模式之《结构型模式》版块(基于Java)

代码示例 //Component 这是组合中对象声明抽象类 public abstract class OrganizationComponent { /**名字*/ private String name; /**说明*/ private String des; public OrganizationComponent(String name, String des) { this.name = name; this.des = des; } protected void add(OrganizationComponent component){ //默认实现 抛出一个异常 不支持操作的异常 throw new UnsupportedOperationException(); } protected void remove(OrganizationComponent component){ //默认实现 抛出一个异常 不支持操作的异常 throw new UnsupportedOperationException(); } /**打印方法做成抽象的 因为每个组织都应该有打印方法 子类都需要实现*/ protected abstract void print(); public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDes() { return des; } public void setDes(String des) { this.des = des; } } //----------------------------------------------------------------------------- //学校类 University就是Composite 可以管理 College public class University extends OrganizationComponent { /**学院集合*/ private List<OrganizationComponent> colleges = new ArrayList<>(); public University(String name, String des) { super(name, des); } /**重写add方法 添加学院功能*/ @Override protected void add(OrganizationComponent component) { colleges.add(component); } /**重写remove方法 添加删除学院功能*/ @Override protected void remove(OrganizationComponent component) { colleges.remove(component); } /**print方法 就是输出University 包含的学院*/ @Override protected void print() { System.out.println("-------------------"+ getName() +"-------------------"); //遍历所有学院 for (OrganizationComponent college : colleges) { college.print(); } } /**重写get方法*/ @Override public String getName() { return super.getName(); } @Override public String getDes() { return super.getDes(); } } //----------------------------------------------------------------------------- //学院类 College就是Composite 可以管理 Department public class College extends OrganizationComponent { /**系集合*/ private List<OrganizationComponent> departments = new ArrayList<>(); public College(String name, String des) { super(name, des); } @Override protected void print() { System.out.println("------------"+getName()+"------------"); for (OrganizationComponent department : departments) { department.print(); } } /**重写add方法 添加系功能*/ @Override protected void add(OrganizationComponent component) { departments.add(component); } /**重写remove方法 添加删除系s功能*/ @Override protected void remove(OrganizationComponent component) { departments.remove(component); } @Override public String getName() { return super.getName(); } @Override public String getDes() { return super.getDes(); } } //----------------------------------------------------------------------------- //系类 叶子节点 public class Department extends OrganizationComponent { public Department(String name, String des) { super(name, des); } //add,remove 就不需要重写了 因为他是叶子节点不需要去管理其它组件 protected void print() { System.out.println(getName()); } public String getName() { return super.getName(); } public String getDes() { return super.getDes(); } } //----------------------------------------------------------------------------- //测试 public class Client { public static void main(String[] args) { //创建学校 OrganizationComponent university = new University("南京大学", "中国知名院校"); //创建学院 OrganizationComponent computerCollege = new College("计算机学院", "计算机学院"); OrganizationComponent infoEngineerCollege = new College("信息工程学院", "信息工程学院"); //创建各个学院下面的系(专业) computerCollege.add(new Department("软件工程","软件工程")); computerCollege.add(new Department("网络工程","网络工程")); computerCollege.add(new Department("计算机科学与技术","计算机科学与技术是老牌专业")); infoEngineerCollege.add(new Department("通信工程","通信工程不好学")); infoEngineerCollege.add(new Department("信息工程","信息工程很好学")); //将学院加入到学校中 university.add(computerCollege); university.add(infoEngineerCollege); computerCollege.print(); } } 组合模式在JDK集合的源码分析

Java的集合类-HashMap就使用了组合模式

UML类图 + 代码分析 + 截图

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzjxd.html