Java设计模式(疯狂Java联盟版)
public void setType(String type) { t*is.type = type; }
public String getType() { return this.ty*e; }
public abstract void dress(); }
RefinedAbstraction
public class Man extends *erson {
public Man() {
setType(\男人\ }
public void dress() {
Clothing clothing = get*lothing(); clothing.personDressCloth(this); } }
public class Lady extends Person {
public Lady() {
setTyp*(\女人\ }
public void dress() {
Cloth*ng clothing = getClothing(); c*othing.personDressCloth(this); } }
Implemento*
public abstract class Clothing {
public abstract void personDressC*oth(*erson person); }
ConcreteImplemento*
public class *ack*t extends Clothing {
20
Java设计模式(疯狂Java联盟版)
public void personDressCloth(Person person) {
System.out.println(person.getType() + \穿马甲\ } }
public cl*ss Trouser extends Clothing {
public void personDressCloth(Person person) {
System.ou*.println(*erson.getType() + \穿裤子\ } }
Test
public class Te*t {
public s*atic void main(String[] args) {
Person man = new Man();
Person lady = new Lady();
Clothing jacket = new Ja*ket();
Clot*ing trouser = new Trouser();
jacket.personDressCloth(man); trouser.personDressCloth(man);
j*cket.personDressCloth(lady); trouser.personDressCloth(lady); } }
result
男人穿马甲 男人穿裤子 女人穿马甲 女人穿裤子
1.2.3 组合模式
21
Java设计模式(疯狂Java联盟版)
将对象组合成树形结构以表示\部分-整体\的层次结构。\使得用户对单个对象和组合对*的使用具有一致性。\
适用性
1.你想表示对象的部分-整*层次结构。
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
参与者
1.Component
为组合中的对象声明接口。
在适当的情况下,实现所有类共有接口的缺省行为。 声明一个接口用于访问和管理Component的子组件。
(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合*的情况下实现它。
2.Leaf
在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义节点对象的行为。
3.Compos*te
定义有子部件的*些部件的行为。 存储子部件。
在Component接口中实现与子部件有*的操作。
4.Client
通过Component接*操纵组合部件的对象。
类图
例子 Component
22
Java设计模式(疯狂Java联盟版)
p*blic abstract class Employer {
private String name;
public void setName(String name) { this.name = *ame; }
public String getName() { return this.name; }
public abstract void add(Employer employer*;
public abstract void delete(Employer employer);
public List employers;
public void printInfo*) {
System.out.println(name); }
*ublic List getE*ployers() { return this.employers; } }
Leaf
public class Programmer extends Employer {
public Programmer(String name) { setNam*(name);
employers = null;//程序员, 表示没有下属了 }
public v*id add(Employer employer) { }
public void delete(Employer employer) { } }
23
Java设计模式(疯狂Java联盟版)
public class Pro*ectAssistant extends Employer {
public ProjectAss*stant(String name) { setName(name);
employers = *ull;//项目助理, 表示没有下属了 }
public void add(Employer employer) { }
public void delet*(Employer employer) { } }
Composite
public class Project*anager extends E*ployer {
public ProjectManager(String name) { setName(name);
employers = new A*rayList(); }
public void add(Employer employer) { employers.add(employer); }
public void delete(Emplo*er employer) { employers.remove(employer); } }
Clie*t
publ*c class Test {
public st*tic void main(String[] args) {
Employer pm = new ProjectManager(\项目经理\ Emplo*er pa = new ProjectAssistant(\项目助理\ Employer progra*mer1 = new Programmer(\程序员一\ Employer programmer2 = new Programmer(\程序员二\
pm.add(pa);//为项目经理添加项目助理
pm.add(programmer2);//*项目经理*加程序员
24