设计模式之组合模式

组合模式是一种树状结构的专用模式,主要用来组合对象。它可以比较清晰的显示出部分和整体层次,因为这种模式的妙用在于整合而不是创建,因此我们常把他看做结构型模式的一种。

场景描述

某公司CEO下设有销售经理和市场经理,两个经理下各自有自己的下属员工,现遍历公司人员结构树,打印所有人员的薪资职位等状况。

在这里插入图片描述

代码实现

下面是改写自菜鸟教程的一段示例代码:


class Employee {
    name: string;
    dept: string;
    salary: number;
    subordinates: Array<Employee>;
    constructor(name: string, dept: string, sal: number) {
        this.name = name;
        this.dept = dept;
        this.salary = sal;
        this.subordinates = [];
    }
    add(e: Employee): void {
        this.subordinates.push(e)
    }
    remove(e: Employee): void {
        let n = this.subordinates.indexOf(e);
        this.subordinates.splice(n, -1);
    }
    getSubordinates(): Array<Employee> {
        return this.subordinates;
    }
    toString(): string {

        return ("Employee :[ Name : "+ this.name 
      +", dept : "+ this.dept + ", salary :"
      + this.salary+" ]")
    }
}

let CEO:Employee = new Employee("John","CEO", 30000);
 
let headSales:Employee = new Employee("Robert","Head Sales", 20000);

let headMarketing:Employee = new Employee("Michel","Head Marketing", 20000);

let clerk1:Employee = new Employee("Laura","Marketing", 10000);
let clerk2:Employee = new Employee("Bob","Marketing", 10000);

let salesExecutive1:Employee = new Employee("Richard","Sales", 10000);
let salesExecutive2:Employee = new Employee("Rob","Sales", 10000);

CEO.add(headSales);
CEO.add(headMarketing);

headSales.add(salesExecutive1);
headSales.add(salesExecutive2);

headMarketing.add(clerk1);
headMarketing.add(clerk2);

//打印该组织的所有员工
console.log(CEO.toString());
for (let headEmployee of CEO.getSubordinates()) {
   console.log(headEmployee.toString());
   for (let  employee of headEmployee.getSubordinates()) {
    console.log(employee.toString());
   }
}        

程序运行结果:
图片
组合模式可以将分散的数据和对象整合成整体,方便调用和扩展。组合后的对象被公共使用,因此需要按单例原则设计,保证实例唯一。开发过程中为保证安全,还需要尽量对树上不同节点的读写权限做一定的控制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值