设计模式从入门到放弃(九)组合模式

基本概念

组合模式(Composite Pattern) 强调整体和部分的关系,将对象构成一个树状结构,表现出整体和部分的层次。组合模式使得访问单一对象和组合对象具有一致性,让客户端可以用同一种方式来处理个别和组合对象。

UML

在这里插入图片描述

角色分析

  • Component 节点抽象 抽取所有节点共有行为
  • Left 末级叶子节点 只有操作方法
  • Composite 非末级节点 可以对下级节点进行维护操作

现在有一个需求管理学校->班级->同学,就可以使用组合模式进行管理其中学校和班级就是Composite节点同学就是Left节点

代码实现

// 顶级抽象节点 Component 
@Data
public abstract class Component {

    String name;

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

    void add(Component component) {
        throw new UnsupportedOperationException();
    }

    void remove(Component component) {
        throw new UnsupportedOperationException();
    }

    List<Component> children() {
        throw new UnsupportedOperationException();
    }
	// 通用方法
    abstract void print();
}
// Composite  非末级节点
public class School extends Component {
    // 下级元素
    List<Component> classes = new ArrayList<>();

    public School(String name) {
        super(name);
    }

    @Override
    public void add(Component component) {
        classes.add(component);
    }

    @Override
    public void remove(Component component) {
        classes.remove(component);
    }

    @Override
    public List<Component> children() {
        return classes;
    }

    @Override
    void print() {
        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents
        for (Component c : classes) {
            c.print();
        }
    }
}
// Composite  非末级节点 班级
public class Classes extends Component {

    List<Component> classmates = new ArrayList<>();

    public Classes(String name) {
        super(name);
    }

    @Override
    public void add(Component component) {
        classmates.add(component);
    }

    @Override
    public void remove(Component component) {
        classmates.remove(component);
    }

    @Override
    public List<Component> children() {
        return classmates;
    }

    @Override
    void print() {
        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents
        for (Component c : classmates) {
            c.print();
        }
    }
}
// Left节点叶子节点 没有关于Add和remove 的操作
public class Classmate extends Component {

    public Classmate(String name) {
        super(name);
    }

    @Override
    void print() {
        System.out.println("同学" + this.name);
    }
}

使用细节

  • 简化用户操作,客户端对对象的调用一致屏蔽整合和部分的区别
  • 拓展性强修改组合对象只需要调整层次,客户端无修改
  • 适合树状结构的数据,如果各节点的差异较大不适合用组合模式

猜你喜欢

转载自blog.csdn.net/woshiwjma956/article/details/105854806
今日推荐