组合模式有时候又叫做部门-整体模式,它是我们树形机构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
将对象组合成树形结构以表示”部分-整体“的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性
两种实现方式:
a) 将管理子元素的方法定义在Composite类中
组成:
Component(抽象构件接口)
----为组合的对象声明接口
----在某些情况下爱实现从此接口派生的所有类共有的默认行为
----定义一个接口可以访问及管理它的多个子部件
package com.ebuair.pattern.component;
//Component(抽象构件接口):
//为组合的对象声明接口
//在某些情况下爱实现从此接口派生的所有类共有的默认行为
//定义一个接口可以访问及管理它的多个子部件
public interface Commonent {
public void invokeMethod();
}
Leaf(叶部件)
----在组合中表示叶节点对象,叶节点没有子节点
----定义组合中接口对象的行为
package com.ebuair.pattern.component;
//Leaf(叶部件):
//在组合中表示叶节点对象,叶节点没有子节点
//定义组合中接口对象的行为
public class Leaf implements Commonent{
@Override
public void invokeMethod() {
System.out.println("invoke method!!!");
}
}
Composite(组合类)
----定义有子节点(子部件)的部件的行为
----存储子节点(子部件)
----在Component接口中实现与子部件相关的操作
package com.ebuair.pattern.component;
import java.util.ArrayList;
import java.util.List;
//Composite(组合类)
//定义有子节点(子部件)的部件的行为
//存储子节点(子部件)
//在Component接口中实现与子部件相关的操作
public class Composite implements Commonent {
private List<Commonent> commonentList = new ArrayList<Commonent>();
public void add(Commonent commonent){
this.commonentList.add(commonent);
}
public void remove(Commonent commonent){
this.commonentList.remove(commonent);
}
public List<Commonent> getCommonentsList(){
return commonentList;
}
@Override
public void invokeMethod() {
for(Commonent commonent : commonentList){
commonent.invokeMethod();
}
}
}
Client(客户端)
----通过Component接口控制组合部件的对象
package com.ebuair.pattern.component;
public class Client {
public static void main(String[] args) {
Commonent leaf1 = new Leaf();
Commonent leaf2 = new Leaf();
Composite commonent1 = new Composite();
Composite commonent2 = new Composite();
Commonent leaf3 = new Leaf();
Commonent leaf4 = new Leaf();
commonent1.add(leaf1);
commonent1.add(leaf2);
commonent2.add(commonent1);
commonent2.add(leaf3);
commonent2.add(leaf4);
commonent2.invokeMethod();
}
}
b) 将管理子元素的方法定义在Component接口中,这样Leaf类就需要对这些方法空实现。
组成:
Component(抽象构件接口)
----为组合的对象声明接口
----在某些情况下爱实现从此接口派生的所有类共有的默认行为
----定义一个接口可以访问及管理它的多个子部件
package com.ebuair.pattern.component;
import java.util.List;
public interface Commponent2 {
public void invokeMethod();
public void add(Commponent2 commponent);
public void remove(Commponent2 commponent);
public List<Commponent2> getAllCommponent2();
}
Leaf(叶部件)
----在组合中表示叶节点对象,叶节点没有子节点
----定义组合中接口对象的行为
package com.ebuair.pattern.component;
import java.util.List;
public class Leaf2 implements Commponent2 {
@Override
public void invokeMethod() {
System.out.println("invoke method invoke!!!");
}
@Override
public void add(Commponent2 commponent) {
}
@Override
public void remove(Commponent2 commponent) {
}
@Override
public List<Commponent2> getAllCommponent2() {
// TODO Auto-generated method stub
return null;
}
}
Composite(组合类)
----定义有子节点(子部件)的部件的行为
----存储子节点(子部件)
----在Component接口中实现与子部件相关的操作
package com.ebuair.pattern.component;
import java.util.ArrayList;
import java.util.List;
public class Commposite2 implements Commponent2 {
private List<Commponent2> leaf2List = new ArrayList<Commponent2>();
@Override
public void invokeMethod() {
for(Commponent2 leaf2 : leaf2List){
leaf2.invokeMethod();
}
}
@Override
public void add(Commponent2 commponent) {
leaf2List.add(commponent);
}
@Override
public void remove(Commponent2 commponent) {
leaf2List.remove(commponent);
}
public List<Commponent2> getAllCommponent2() {
return leaf2List;
}
}
Client(客户端)
----通过Component接口控制组合部件的对象
package com.ebuair.pattern.component;
public class Client2 {
public static void main(String[] args) {
Commponent2 leaf1 = new Leaf2();
Commponent2 leaf2 = new Leaf2();
Commponent2 commponent1 = new Commposite2();
Commponent2 commponent2 = new Commposite2();
Commponent2 leaf3 = new Leaf2();
Commponent2 leaf4 = new Leaf2();
commponent1.add(leaf1);
commponent1.add(leaf2);
commponent2.add(commponent1);
commponent2.add(leaf3);
commponent2.add(leaf4);
commponent2.invokeMethod();
}
}