设计模式之组合模式

Posted l_learning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之组合模式相关的知识,希望对你有一定的参考价值。

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

从设计的角度看,组合模式涉及到三个角色:

抽象根节点:它是一个抽象接口,定义了算法;
具体节点:实现或继承自抽象根节点,完成具体算法操作;
客户端:客户类提出使用具体类的请求;

示例

以餐厅为例,餐厅有餐厅经理,厨师,服务员等员工,每一个员工都要工作,餐厅经理管理员工,可以将所有员工都设置为经理属性。

新建员工基类

public abstract class Employees {

    /**
     * 名称
     */
    protected String name;

    /**
     * 构造器赋名
     * @param name
     */
    public Employees(String name){
        this.name = name;
    }

    /**
     * 新增员工
     * @param employees
     * @throws Exception
     */
    public void addEmployees(Employees employees) throws Exception{
        throw new Exception("Invalid exception");
    }

    /**
     * 工作方法
     */
    abstract void work();

}

经理类

经理管理员工,将员工列表作为属性

public class Manager extends Employees {

    List<Employees> employeesList = new ArrayList<>();

    /**
     * 构造器赋名
     *
     * @param name
     */
    public Manager(String name) {
        super(name);
    }

    @Override
    public void addEmployees(Employees employees) throws Exception {
        employeesList.add(employees);
    }

    @Override
    void work() {
        System.out.println("我是"+name+":开始布置任务");
        for (Employees employees:employeesList){
            employees.work();
        }
    }

}

厨师类

厨师负责制作湘菜和川菜

public class Cook extends Employees {

    /**
     * 构造器赋名
     *
     * @param name
     */
    public Cook(String name) {
        super(name);
    }

    @Override
    void work() {
        System.out.println("我是"+name+":开始工作");
    }

}

服务员

服务员负责点餐和收账

public class Waiter extends Employees {

    /**
     * 构造器赋名
     *
     * @param name
     */
    public Waiter(String name) {
        super(name);
    }

    @Override
    void work() {
        System.out.println("我是"+name+":开始工作");
    }
}

老板

老板招了5个员工,开始组织员工工作

public class Boss {

    public static void main(String[] args) throws Exception {
        Employees employees = new Manager("餐厅经理");
        employees.addEmployees(new Cook("湘菜厨师"));
        employees.addEmployees(new Cook("川菜厨师"));
        employees.addEmployees(new Waiter("点餐服务员"));
        employees.addEmployees(new Waiter("结账服务员"));
        employees.work();
    }

}

执行结果展示

我是餐厅经理:开始布置任务
我是湘菜厨师:开始工作
我是川菜厨师:开始工作
我是点餐服务员:开始工作
我是结账服务员:开始工作

以上是关于设计模式之组合模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之组合模式

设计模式之组合模式

设计模式探秘之组合模式

学习设计模式之组合模式

设计模式之组合模式

PHP设计模式之组合模式