设计模式之组合模式

组合模式(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();
    }

}

执行结果展示

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值