关于后端:谈一谈组合模式

38次阅读

共计 1696 个字符,预计需要花费 5 分钟才能阅读完成。

简介

组合模式就是组合多个对象造成树形构造以示意具备“局部 – 整体”关系的层次结构。组合模式对单个对象(叶子对象)和组合对象(容器对象)的应用具备一致性。

组合模式的要害是定义一个形象构件类,它既能够代表叶子,也能够代表容器。客户端针对该形象构件进行编程,无需晓得它到底示意的是叶子还是容器,能够对其进行对立解决。

具体实现

对于组合模式的形象构件角色,其代码示例如下:


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();}
如果继承形象构件类的是叶子构件,其代码示例如下:public class Leaf extends Component {
    @Override
    public void add(Component c) {
        // 减少成员
        // 异样解决或业务提醒
    }
 
    @Override
    public void remove(Component c) {
        // 删除成员
        // 异样解决或业务提醒
    }
 
    @Override
    public Component getChild(int i) {
        // 获取成员
        // 异样解决或业务提醒
    }
 
    @Override
    public void operation() {
        // 业务办法
        // 叶子构件具体业务办法的实现
    }
}

如果继承形象构件类的是容器构件,其代码示例如下:


import java.util.ArrayList;
 
public class Composite extends Component {private final ArrayList<Component> list = new ArrayList<>();  
  
    @Override  
    public void add(Component c) {  
        // 减少成员  
        list.add(c);  
    }  
  
    @Override  
    public void remove(Component c) {  
        // 删除成员  
        list.remove(c);  
    }  
  
    @Override  
    public Component getChild(int i) {  
        // 获取成员  
        return (Component) list.get(i);  
    }  
  
    @Override  
    public void operation() {  
        // 业务办法  
        // 叶子构件具体业务办法的实现  
        // 递归调用成员构件的业务办法  
        for (Component obj : list) {obj.operation();  
        }  
    }  
}

分类

在应用组合模式时,依据形象构件类的定义模式,能够将组合模式分为通明组合模式和平安组合模式两种。

通明组合模式

在通明组合模式中,形象构件类申明了所有用于治理成员的办法,如 add()、remove()、getChild() 等所有办法。

通明组合模式也是组合模式的规范模式,这样做的益处是确保所有的构件类都应用雷同的接口。

其毛病就是不够平安,因为叶子对象和容器对象有实质上的区别,对叶子对象提供 add()、remove()、getChild() 等办法是没有意义的,如果没有提供相应的错误处理代码,在运行阶段有可能会出错。

平安组合模式

在平安组合模式中,形象构件类没有申明任何治理成员的办法,只申明形象的业务办法。

这样的做法是平安的,因为基本不向叶子对象提供这些治理成员对象的办法,对于叶子对象,客户端不可能调用到这些办法。

绝对的,其毛病就是不够通明,因为叶子构件和容器构件具备不同的办法,客户端不能齐全针对形象编程,必须有区别地看待叶子构件和容器构件。

总结

长处

组合模式的次要长处如下:

组合模式为树形构造的面向对象实现提供了一种灵便的解决方案
在组合模式中减少新的叶子构件和容器构件都很不便,合乎开闭准则
客户端能够统一地应用一个组合构造或其中单个对象,简化了客户端代码

毛病

组合模式的次要毛病如下:

设计较简单,客户端须要破费更多工夫理清类之间的档次关系
在减少新构件时很难对容器中的构件类型进行限度,通常通过运行时进行类型查看来实现

正文完
 0