组合模式

[size=x-large][b]组合模式[/b][/size]
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。
_____________________________________________________________________________________
[size=x-large][b]介绍[/b][/size]
[b]意图[/b]:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
[b]主要解决[/b]:它在我们树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理元素,从而使得客户程序与复杂元素的内部结构解耦。
[b]何时使用[/b]:1、想表示对象的部分-整体层次结构(树形结构),2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
[b]如何解决[/b]:树枝和叶子实现统一接口,树枝内部组合该接口。
[b]关键代码[/b]:树枝内部组合该接口,并且含有内部属性List,里面放Component.
[b]应用实例[/b]:1、算术表达式包括操作娄、操作符和另一个操作数,其中,另一个操作符也可以是操作树、操作符和另画个操作数。2、在JAVA AWT 和SWING中,对于Button和Checkbox是树叶,Container是树枝。
[b]优点[/b]:1、高层模块调用简单。2、节点自由增加。
[b]缺点[/b]:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
[b]使用场景[/b]:部分、整体场景,如树形菜单,文件、文件夹的管理。
[b]注意事项[/b]:定义时为具体类。
__________________________________________________________________________________
[size=x-large][b]实现[/b][/size]
我们有一个类Employee,该类被当作组合模型类。CompositePatternDemo,我们的演示类使用Employee类来添加部门层次结构,并打印所有员工。
[img]http://dl2.iteye.com/upload/attachment/0128/7946/02a3a871-b735-316e-9e18-90dc91abb644.jpg[/img]

__________________________________________________________________________________
[size=small][b]步骤1[/b][/size]
Employee.java

import java.util.ArrayList;
import java.util.List;

public class Employee {

private String name;
private String dept;
private int salary;
private List<Employee> subordinates;

//构造函数
public Employee(String name,String dept,int salary){
this.name = name;
this.dept = dept;
this.salary = salary;
subordinates = new ArrayList<Employee>();
}

public void add(Employee employee){
subordinates.add(employee);
}

public void remove(Employee employee){
subordinates.remove(employee);
}

public List<Employee> getSubordinates(){
return subordinates;
}
public String toString(){
return("Employee:[Name:"+name
+",dept:"+dept+",salary:"+salary+"]");
}
}


[size=small][b]步骤2[/b][/size]
使用Employee类开创建和打印员工的层次结构。
CompositePatternDemo.java

public class CompositePatternDemo {

public static void main(String[] args) {
Employee CEO = new Employee("John","CEO",30000);

Employee headSales = new Employee("Robert","Head Sales",20000);

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

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

Employee sales1 = new Employee("Richard","Sales",10000);
Employee sales2 = new Employee("Rob","Sales",10000);

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

headSales.add(sales1);
headSales.add(sales2);

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

//打印该组织所有员工
System.out.println(CEO);

for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}

}

}

[size=small][b]步骤3[/b][/size]
验证输出。

Employee:[Name:John,dept:CEO,salary:30000]
Employee:[Name:Robert,dept:Head Sales,salary:20000]
Employee:[Name:Richard,dept:Sales,salary:10000]
Employee:[Name:Rob,dept:Sales,salary:10000]
Employee:[Name:Michel,dept:Head Marketing,salary:20000]
Employee:[Name:Laura,dept:Marketing,salary:10000]
Employee:[Name:Bob,dept:Marketing,salary:10000]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值