设计模式之组合模式
组合模式是一种树状结构的专用模式,主要用来组合对象。它可以比较清晰的显示出部分和整体层次,因为这种模式的妙用在于整合而不是创建,因此我们常把他看做结构型模式的一种。
场景描述某公司CEO下设有销售经理和市场经理,两个经理下各自有自己的下属员工,现遍历公司人员结构树,打印所有人员的薪资职位等状况。
【设计模式之组合模式】
文章图片
代码实现下面是改写自菜鸟教程的一段示例代码:
class Employee {
name: string;
dept: string;
salary: number;
subordinates: Array;
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 {
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 (letemployee of headEmployee.getSubordinates()) {
console.log(employee.toString());
}
}
程序运行结果:
文章图片
组合模式可以将分散的数据和对象整合成整体,方便调用和扩展。组合后的对象被公共使用,因此需要按单例原则设计,保证实例唯一。开发过程中为保证安全,还需要尽量对树上不同节点的读写权限做一定的控制。
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息