Java设计模式-图解-附代码(4)

2019-03-29 11:23

Java设计模式(疯狂Java联盟版) } Test

public class Test {

public static void main(String[] args) { Person man = new Man(); Person lady = new Lady();

Clothing jacket = new Jacket(); Clothing trouser = new Trouser(); jacket.personDressCloth(man); trouser.personDressCloth(man); jacket.personDressCloth(lady); trouser.personDressCloth(lady); } }

result

男人穿马甲 男人穿裤子 女人穿马甲 女人穿裤子

1.2.3 组合模式

将对象组合成树形结构以表示\部分-整体\的层次结构。\使得用户对单个对象和组合对*的使用具有一致性。\

适用性

1.你想表示对象的部分-整体层次结构。

2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

参与者

1.Component

为组合中的对象声明接口。

在适当的情况下,实现所有类共有接口的缺省行为。 声明一个接口用于访问和管理Component的子组件。

(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合并的情况下实现它。 2.Leaf

在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义节点对象的行为。 3.Composite

定义有子部件的一些部件的行为。 存储子部件。

在Component接口中实现与子部件所有的操作。 4.Client

通过Component接口操纵组合部件的对象。

类图 例子 Component

15

Java设计模式(疯狂Java联盟版)

public abstract class Employer { private String name;

public void setName(String name) { this.name = name; }

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); }

public List getEmployers() { return this.employers; } }

Leaf

public class Programmer extends Employer { public Programmer(String name) { setName(name);

employers = null;//程序员, 表示没有下属了 }

public void add(Employer employer) { }

public void delete(Employer employer) { } }

public class ProcectAssistant extends Employer { public ProjectAssistant(String name) { setName(name);

employers = null;//项目助理, 表示没有下属了 }

public void add(Employer employer) { }

public void delete(Employer employer) { } }

Composite

public class Projectmanager extends Employer { public ProjectManager(String name) { setName(name);

employers = new ArrayList(); }

public void add(Employer employer) {

16

Java设计模式(疯狂Java联盟版)

employers.add(employer); }

public void delete(Employer employer) { employers.remove(employer); } }

Clie*t

public class Test {

public static void main(String[] args) {

Employer pm = new ProjectManager(\项目经理\ Employer pa = new ProjectAssistant(\项目助理\ Employer programmer1 = new Programmer(\程序员一\ Employer programmer2 = new Programmer(\程序员二\ pm.add(pa);//为项目经理添加项目助理

pm.add(programmer2);//为项目经理添加程序员 List ems = pm.getEmployers(); for (Employer em : ems) {

System.out.println(em.getName()); } } }

result

项目助理 程序员二

1.2.4 装饰模式

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

适用性

1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 2.处理那些可以撤消的职责。

3.当不能采用生成子类的方法进行扩充时。

参与者

1.Component

定义一个对象接口,可以给这些对象动态地添加职责。 2.ConcreteComponent

定义一个对象,可以给这个对象添加一些职责 3.Decorator

维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。 4.ConcreteDecorator 向组件添加职责。

类图

17

Java设计模式(疯狂Java联盟版)

例子

Component定义一个对象接口,可以给这些对象动态地添加职责。

public interface Person { void eat(); }

ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。

public class Man implements Person { public void eat() { System.out.println(\男人在吃\ } }

Decorator 维持一个执行Component对象的指针,并定义一个与Componect 接口一致的接口。

public abstract class Decorator implements Person { protected Person person;

public void setPerson(Person person) { this.person = person; }

public void eat() { person.eat(); } }

ConcreteDectrator 想组建添加职责

public class ManDecoratorA extends Decorator { public void eat() { super.eat(); reEat();

System.out.println(\类\ }

public void reEat() {

System.out.println(\再吃一顿饭\ } }

public class ManDecoratorB extends Decorator { public void eat() { super.eat();

18

Java设计模式(疯狂Java联盟版)

System.out.println(\ System.out.println(\类\ } }

Test

public class Test {

public static void main(String[] args) { Man man = new Man();

ManDecoratorA md1 = new ManDecoratorA(); ManDecoratorB md2 = new ManDecoratorB(); md1.setPerson(man); md2.setPerson(md1); md2.eat(); } }

result

男人在吃 再吃一顿饭

ManDecoratorA类 =============== ManDecoratorB类

1.2.5 外观模式

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。

适用性

1.当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越 复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容 易对子系统进行定制,但这也给这些不需要定制子系统的用户带来一些使用上的困难。 Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需 要更多的可定制性的用户可以越过facade层。

2.客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客 户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

3.当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。 如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们 之间的依赖关系。

参与者

1.Facade

知道哪些子系统类负责处理请求。

将客户的请求代理给适当的子系统对象。 2.Subsystemclasses 实现子系统的功能。

处理由Facade对象指派的任务。

19


Java设计模式-图解-附代码(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2009中考分类汇编-二次函数

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: