设计模式课时四------组合模式

筅森魡賤 提交于 2019-12-06 18:35:24

组合模式

定义:组合模式(又为 ‘整体-部分’ 模式)屏蔽了容器对象与单个对象在使用时的差异,为客户端提供统一的操作接口,从而降低客户代码与被调用对象的耦合关系,方便系统的维护与扩展。

interface Component 
{
    void Add(Component c);//添加树叶/树枝
    void Remove(Component c);//移除
    void Display(int depth);//打印/显示
}

/**
 * 枝节点
 */
class Composite implements Component
{
    private List<Component> children = new ArrayList<Component>();
    @Override
    public void Add(Component c) 
    {
        children.add(c);
    }
    @Override
    public void Remove(Component c) 
    {
        children.remove(c);
    }
    @Override
    public void Display(int depth) 
    {
        System.out.println("A"+depth);
        for ( Component c: children)
        {
            c.Display(depth+1);
        }
    }
}


/**
 * 叶节点
 */
class Leaf implements Component
{

    @Override
    public void Add(Component c) 
    {
        //叶节点无需增加分支和树叶,所以直接实现
        System.out.println("Cannot add to a leaf");
    }
    @Override
    public void Remove(Component c) 
    {
        System.out.println("Cannot remove to a leaf");
    }
    @Override
    public void Display(int depth) 
    {
         System.out.println("A"+depth);
    }
}
public class Demo 
{
    public static void main(String[] args) 
    {
        //根节点实例化
        Component  root= new Composite();
        //分枝X
        Composite  composite= new Composite();
        //分枝X上添加的叶子
        composite.Add(new Leaf());
        composite.Add(new Leaf());
        //添加到主根上
        root.Add(composite);
        //分枝Y
        Composite composite1 = new Composite();
        //添加Y到主根上
        root.Add(composite1);
        //分枝Y上添加的叶子
        composite1.Add(new Leaf());
        composite1.Add(new Leaf());
//        root.Remove(composite1);
        root.Display(1);
    }
}

组合模式分为:透明方式 和 安全方式
透明方式:(本文举例就属于透明方式)
在Component接口中声明用来管理子对象的方法中包含:add和remove。
优点:这样树枝树叶对于外界没有区别,具备完全一致的行为接口。
缺点:Leaf本身不具备add和remove方法的功能,实现也没有意义。

安全方式
在Component接口中不去声明add和remove方法,而是在Composite声明所用来管理子类对象的方法。
优点:Leaf无需实现add和remove方法。
缺点:由于不透明,树枝树叶 具备不同的接口,客户端调用的时候需要做相应的判断,带来了不便。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!