每日设计模式之组合模式

组合模式

组合多个对象形成树形结构以表示具有“整体—部分”关系的层 次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致 性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式

//抽象构件
public abstract class Component {
    public abstract void add(Component c);
    public abstract void remove(Component c );
    public abstract Component getChild(int i);
    public abstract void operation();
}
//叶子构建A
public class LeafA extends Component {
    @Override
    public void add(Component c) {
        throw new RuntimeException("not support operation!");
    }

    @Override
    public void remove(Component c) {
        throw new RuntimeException("not support operation!");
    }

    @Override
    public Component getChild(int i) {
        throw new RuntimeException("not support operation!");
    }

    @Override
    public void operation() {
        System.out.println("我是leafA");
    }
}
//叶子构建A
public class LeafB extends Component {
    @Override
    public void add(Component c) {
        throw new RuntimeException("not support operation!");
    }

    @Override
    public void remove(Component c) {
        throw new RuntimeException("not support operation!");
    }

    @Override
    public Component getChild(int i) {
        throw new RuntimeException("not support operation!");
    }

    @Override
    public void operation() {
        System.out.println("我是leafB");
    }
}
//容器构建
public class Composite extends Component {

    private String name;

    private ArrayList<Component> lists=new ArrayList<>();

    public Composite(String name) {
        this.name = name;
    }
    @Override
    public void add(Component c) {
        lists.add(c);
    }
    @Override
    public void remove(Component c) {
        lists.remove(c);
    }
    @Override
    public Component getChild(int i) {
        return  lists.get(i);
    }
    @Override
    public void operation() {
        for (Component c:lists
             ) {
            ((Component)c).operation();
        }
    }
}

public class CompositeClient {
    public static void main(String[] args) {
        Composite test1 = new Composite("test1");
        Composite test2 = new Composite("test2");
        LeafA leafA = new LeafA();
        LeafB leafB = new LeafB();
        test2.add(leafA);
        test2.add(leafB);
        test1.add(test2);
        test1.operation();
    }
}

根据抽象构件类的定义形式,我们可将组合模式分为透明组合模式和安 全组合模式两种形式:

  • 透明组合模式中,抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、 remove()以及getChild()等方法,这样做的好处是确保所有的构件类都有相同的接口。在客户端 看来,叶子对象与容器对象所提供的方法是一致的,客户端可以相同地对待所有的对象。透 明组合模式也是组合模式的标准形式

  • 安全组合模式中,在抽象构件Component中没有声明任何用于管理成员对象的方法,而是在 Composite类中声明并实现这些方法。这种做法是安全的,因为根本不向叶子对象提供这些管 理成员对象的方法,对于叶子对象,客户端不可能调用到这些方法

优点

  1. 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽 略了层次的差异,方便对整个层次结构进行控制

  2. 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整 个组合结构,简化了客户端代码

  3. 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符 合“开闭原则”

  4. 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对 象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单

缺点

  1. 在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些 特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型 系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时 进行类型检查来实现,这个实现过程较为复杂

适用场景

  1. 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以 一致地对待它们

  2. 在一个使用面向对象语言开发的系统中需要处理一个树形结构

  3. 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新 的类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值