模式名称
组合模式(Composite Pattern)
解决问题
它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
在公司中就是一种树形结构,分为领导与普通员工,领导可能管理着部分员工和其他相对低级的领导,这时候我们可以利用组合模式来解决这个问题。
解决方法
1.Component:组合中的对象声明接口,在适当情况下实现所有类共有的默认行为,声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。(可选)
2.Leaf:在组合中表示叶节点,叶节点没有子节点,定义对象的基本行为。
3.Composite:定义有子部件的那些部件的行为,存储子部件并在Component接口实现与子部件有关的操作。
4.Client:通过Component接口操作组合部件的对象。
组合模式的优点
1.允许客户端对叶节点和枝节点一视同仁。
2.方便处理层次结构的问题。
组合模式的缺点
1.枝节点的责任比较复杂。
2.需要客户端需要加入一些判断来保证安全性。
代码
1 2 3 4 5 6 7 |
package composite; public interface Worker { public void doSomething(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package composite; public class Employe implements Worker { private String name; public Employe(String name) { super(); this.name = name; } @Override public void doSomething() { System.out.println(toString()); } @Override public String toString() { // TODO Auto-generated method stub return "我叫"+getName()+",就一普通员工!"; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package composite; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Leader implements Worker { private List<Worker> workers = new CopyOnWriteArrayList<Worker>(); private String name; public Leader(String name) { super(); this.name = name; } public void add(Worker worker){ workers.add(worker); } public void remove(Worker worker){ workers.remove(worker); } public Worker getChild(int i){ return workers.get(i); } @Override public void doSomething() { System.out.println(toString()); Iterator<Worker> it = workers.iterator(); while(it.hasNext()){ it.next().doSomething(); } } @Override public String toString() { // TODO Auto-generated method stub return "我叫"+getName()+", 我是一个领导,有 "+workers.size()+"下属。"; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package composite; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub Leader leader1 = new Leader("张三"); Leader leader2 = new Leader("李四"); Employe employe1 = new Employe("王五"); Employe employe2 = new Employe("赵六"); Employe employe3 = new Employe("陈七"); Employe employe4 = new Employe("徐八"); leader1.add(leader2); leader1.add(employe1); leader1.add(employe2); leader2.add(employe3); leader2.add(employe4); leader1.doSomething(); } |
(完)