设计模式之组合模式

组合模式

组合模式有时候叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户端可以像处理简单元素一样来处理复杂元素,从而使得客户端与复杂元素的内部结构解耦。

意图

将对象组合成树型结构以表示“部分-整体”的层次结构。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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值