设计模式之组合模式(Composite Pattern)

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
介绍
意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

优点: 1、高层模块调用简单。 2、节点自由增加。

缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

代码:
员工类:

public class Employee {
    private int id;
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subsubordinates;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public List<Employee> getSubsubordinates() {
        return subsubordinates;
    }

    public void setSubsubordinates(List<Employee> subsubordinates) {
        this.subsubordinates = subsubordinates;
    }

    public Employee() {
        super();
    }

    public Employee(int id, String name, String dept, int salary, List<Employee> subsubordinates) {
        super();
        this.id = id;
        this.name = name;
        this.dept = dept;
        this.salary = salary;
        this.subsubordinates = subsubordinates;
    }

    @Override
    public String toString() {
        String a = "Employee [id=" + id + ", name=" + name + ", dept=" + dept + ", salary=" + salary + "]\n";
        String b = "";
        if (subsubordinates != null && subsubordinates.size() > 0) {
            for (Employee employee : subsubordinates) {
                b += employee.toString();
            }
        }
        return a + b;
    }

}

测试:

扫描二维码关注公众号,回复: 4289388 查看本文章
public class Test {
    public static void main(String[] args) {
        Employee e1=new Employee(201, "张三", "侍郎", 3000, null);
        Employee e2=new Employee(201, "李四", "侍郎", 3000, null);
         List<Employee> eList=new ArrayList<>();
         eList.add(e1);
         eList.add(e2);
        Employee manager=new Employee(200, "司马光", "户部", 10000, eList);
        List<Employee> bList=new ArrayList<>();
        bList.add(manager);
        Employee boss=new Employee(001, "皇帝", "总部", 300000, bList);
        System.out.println(boss.toString());
        
    }
}

打印结果:

Employee [id=1, name=皇帝, dept=总部, salary=300000]
Employee [id=200, name=司马光, dept=户部, salary=10000]
Employee [id=201, name=张三, dept=侍郎, salary=3000]
Employee [id=201, name=李四, dept=侍郎, salary=3000]

总结:
组合模式 就是一个DTO里面再来同类的DTO。在学习hibernate里面的一对多就写过这个,很熟悉。

原博客地址

猜你喜欢

转载自blog.csdn.net/weixin_43671840/article/details/84104585
今日推荐