组合模式
组合模式(Composite)
将对象组合成树型结构以表示“部分-整体”的层次结构,Composite使得客户对单个对象和符合对象的使用具有一致性。
Component(抽象构件接口)
-为组合的对象声明接口
-在某些情况下实现从此接口派生出的所有类共有的默认行为
-定义一登上接口可以访问及管理它的多个子部件
Leaf(叶部件)
-在组合中表示叶结点对象,叶节点没有子节点
-定义组合中接口对象的行为
Composite(组合类)
-定义有子节点(子部件)的部件的行为
-存储子节点(子部件)
-在Component接口中实现与子部件相关的操作
Client(客户端)
-通过Component接口控制组合部件的对象
组合模式有两种实现方式:
1)将管理子元素的方法定义在Composite类中
public interface Component {
public void doSomething();
}
public class Composite implements Component {
private List<Component> list=new ArrayList<Component>();
public void add(Component component){
list.add(component);
}
public void remove(Component component){
list.remove(component);
}
public List<Component> getAll(){
return this.list;
}
@Override
public void doSomething() {
for(Component component:list){
component.doSomething();
}
}
}
public class Leaf implements Component {
@Override
public void doSomething() {
System.out.println("执行方法");
}
}
public class Client {
public static void main(String[] args) {
Component leaf1=new Leaf();
Component leaf2=new Leaf();
Composite comp1=new Composite();
comp1.add(leaf1);
comp1.add(leaf2);
Component leaf3=new Leaf();
Component leaf4=new Leaf();
Composite comp2=new Composite();
comp2.add(comp1);
comp2.add(leaf3);
comp2.add(leaf4);
comp2.doSomething();
}
}
2)将管理子元素的方法定义在Component接口中,这样Leaf类就需要对些方法空实现。
public interface Component {
public void doSomething();
public void add(Component component);
public void remove(Component component);
public List<Component> getAll();
}
public class Composite implements Component {
private List<Component> list=new ArrayList<Component>();
@Override
public void doSomething() {
for(Component component:list){
component.doSomething();
}
}
@Override
public void add(Component component) {
list.add(component);
}
@Override
public void remove(Component component) {
list.remove(component);
}
@Override
public List<Component> getAll() {
return this.list;
}
}
public class Leaf implements Component {
@Override
public void doSomething() {
System.out.println("执行方法");
}
@Override
public void add(Component component) {}
@Override
public void remove(Component component) {}
@Override
public List<Component> getAll() {
return null;
}
}
public class Client {
public static void main(String[] args) {
Component leaf1=new Leaf();
Component leaf2=new Leaf();
Component comp1=new Composite();
comp1.add(leaf1);
comp1.add(leaf2);
Component leaf3=new Leaf();
Component leaf4=new Leaf();
Component comp2=new Composite();
comp2.add(comp1);
comp2.add(leaf3);
comp2.add(leaf4);
comp2.doSomething();
}
}