组合模式
组合模式有时候叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户端可以像处理简单元素一样来处理复杂元素,从而使得客户端与复杂元素的内部结构解耦。
意图
将对象组合成树型结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
角色
Component(抽象构件接口)
- 为组合的对象声明接口
- 在某些情况下实现从此接口派生出的所有类共有的默认行为
- 定义一个接口可以访问及管理它的多个子部件
Leaf(叶部件)
- 在组合中表示页节点对象,叶节点没有子节点
- 定义组合中接口对象的行为
Composite(组合类)
- 定义有子节点(子部件)的部件的行为
- 储存子节点(子部件)
- 在Component接口中实现与子部件相关的操作
Client(客户端)
- 通过Component接口控制组合部件的对象
组合模式有一个隐含的递归过程。
代码实现
第一种方式:
Component接口
public interface Component {
public void execute();
}
Leaf类
public class Leaf implements Component {
public void execute()
{
System.out.println("执行操作");
}
}
Composite类
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;
}
//巧妙之处,隐含递归过程
public void execute() {
for (Component component:list)
{
component.execute();
}
}
}
Client类
public class Client {
public static void main(String[] args) {
Leaf leaf1 = new Leaf();
Leaf leaf2 = new Leaf();
Composite composite = new Composite();
composite.add(leaf1);
composite.add(leaf2);
//只能声明为Composite而不是Component,因为Component中没有add/remove等方法
Composite composite1 = new Composite();
composite1.add(composite);
Leaf leaf3 = new Leaf();
composite1.add(leaf3);
composite1.execute();
}
}
第二种方式:
将Composite中的方法提到Component中
//Component
public interface Component {
public void execute();
public void remove(Component component);
public void add(Component component);
public List<Component> getAll();
}
//Leaf,Leaf中不应该有add/remove操作,所以这里只是空实现
public class Leaf implements Component {
public void execute() {
System.out.println("执行操作");
}
public void remove(Component component) {
}
public void add(Component component) {
}
public List<Component> getAll() {
return new ArrayList<Component>();
}
}
//Composite
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;
}
public void execute() {
for (Component component:list)
{
component.execute();
}
}
}
//Client
public class Client {
public static void main(String[] args) {
Leaf leaf1 = new Leaf();
Leaf leaf2 = new Leaf();
Component composite = new Composite();
composite.add(leaf1);
composite.add(leaf2);
Component composite1 = new Composite();
composite1.add(composite);
Leaf leaf3 = new Leaf();
composite1.add(leaf3);
composite1.execute();
}
}