Composite Pattern

作者: 93张先生 | 来源:发表于2020-08-31 15:47 被阅读0次

组合模式

Composite design pattern helps to compose the objects into tree structures to represent whole-part hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.

特征

  • 树状结构,层级结构
  • 使客户端,对待个体和组合整体统一,没有任何差别

UML

image.png

组件

Component
  • declares the interface for objects in the composition.
  • implements default behavior for the interface common to all classes, as appropriate.
  • declares an interface for accessing and managing its child components.
Leaf
  • represents leaf objects in the composition. A leaf has no children.
  • defines behavior for primitive objects in the composition.
Composite
  • defines behavior for components having children.
  • stores child components.
  • implements child-related operations in the Component interface.
Client
  • manipulates objects in the composition through the Component interface.

在这个 UML 图中,客户端使用 Component 接口来和这个层级的组合进行交互。在层级内部,如果对象是组合,他就把请求传递给自己的叶子节点,如果这个对象是叶子节点,这个请求将被立即执行。

组合叶子节点还可以选择在叶子节点处理请求之前或之后修改请求/响应。

总结

  • 复合模式定义了由单个对象和复合对象组成的类层次结构。
  • 客户端通过组件接口统一处理原语和复合对象,这使得客户端代码简单。
  • 添加新组件很容易,而且客户端代码不需要更改,因为客户端通过component接口处理新组件。
  • 可以使用迭代器设计模式遍历复合层次结构。
  • 访问者设计模式可以对组合进行操作。
  • Flyweight设计模式通常与Composite组合在一起实现共享叶节点。

场景

抽象组件(组织)

抽象组件定义了组件的通知接口,并实现了增删子组件及获取所有子组件的方法。同时重写了hashCode和equales方法。

public abstract class Organization {

  private List<Organization> childOrgs = new ArrayList<Organization>();

  private String name;

  public Organization(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void addOrg(Organization org) {
    childOrgs.add(org);
  }

  public void removeOrg(Organization org) {
    childOrgs.remove(org);
  }

  public List<Organization> getAllOrgs() {
    return childOrgs;
  }

  public abstract void inform(String info);

  @Override
  public int hashCode(){
    return this.name.hashCode();
  }
  
  @Override
  public boolean equals(Object org){
    if(!(org instanceof Organization)) {
      return false;
    }
    return this.name.equals(((Organization) org).name);
  }
简单组件(部门)

简单组件在通知方法中只负责对接收到消息作出响应。

public class Department extends Organization{
  
  public Department(String name) {
    super(name);
  }

  private static Logger LOGGER = LoggerFactory.getLogger(Department.class);
  
  public void inform(String info){
    LOGGER.info("{}-{}", info, getName());
  }

}
复合组件(公司)

复合组件在自身对消息作出响应后,还须通知其下所有子组件

public class Company extends Organization{
  
  private static Logger LOGGER = LoggerFactory.getLogger(Company.class);
  
  public Company(String name) {
    super(name);
  }

  public void inform(String info){
    LOGGER.info("{}-{}", info, getName());
    List<Organization> allOrgs = getAllOrgs();
    allOrgs.forEach(org -> org.inform(info+"-"));
  }

}

MyBatis 中的应用

  • MyBatis 在处理动态 SQL 点时,应用到了组合设计模式。 MyBatis 会将动态 SQL 点解析成对应的 SqlNode 实现,并形成树形结构。

相关文章

网友评论

    本文标题:Composite Pattern

    本文链接:https://www.haomeiwen.com/subject/mreudktx.html