第10章_适配器模式
? 适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,
适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
? 典型的类适配器代码:
public class Adapter extends Adaptee implements Target { public void request() { specificRequest(); } }
? 典型的对象适配器代码:
public class Adapter extends Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee=adaptee; } public void request() { adaptee.specificRequest(); } }
类适配器
ClientTarget+request ()...Adaptee+specificRequest ()...Adapter+request ()...specificRequest(); 对象适配器
ClientTarget+request ()...Adaptee+specificRequest ()...Adapter+request ()...adapteeadaptee.specificRequest(); ? 适配器模式的主要优点是将目标类和适配者类解耦,增加了类的透明性和复用性,
同时系统的灵活性和扩展性都非常好,更换适配器或者增加新的适配器都非常方便,符合“开闭原则”;类适配器模式的缺点是适配器类在很多编程语言中不能同时适配多个适配者类,对象适配器模式的缺点是很难置换适配者类的方法。
? 适配器模式适用情况包括:系统需要使用现有的类,而这些类的接口不符合系统的
需要;想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作。
第14章_外观模式
? 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外
观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 外观模式也是“迪米特法则”
ClientFacadeSubSystemASubSystemBSubSystemC
? 典型的外观角色代码:
public class Facade {
private SubSystemA obj1 = new SubSystemA(); private SubSystemB obj2 = new SubSystemB(); private SubSystemC obj3 = new SubSystemC(); public void method() {
obj1.method(); obj2.method(); obj3.method(); } }
ClientGeneralSwitchFacade-lights: Light[] = new Light[4]-fan: Fan-ac: AirConditioner-tv: Television+GeneralSwitchFacade ()+on (): void+off (): void...lightsfanactvLightFanAirConditionerTelevision-position: String+Light (String position)+on (): void+on (): void+on (): void+on (): void+off (): void+off (): void+off (): void.........+off (): void
...? 外观模式主要优点在于对客户屏蔽子系统组件,减少了客户处理的对象数目并使得
子系统使用起来更加容易,它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;其缺点在于不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
? 外观模式适用情况包括:要为一个复杂子系统提供一个简单接口;客户程序与多个
子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。
第16章_代理模式
? 代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制
对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。
? 典型的代理类实现代码:
public class Proxy implements Subject {
private RealSubject realSubject = new RealSubject(); public void preRequest() {…...}
public void request() {
preRequest();
realSubject.request(); postRequest(); }
public void postRequest() {……} }
Subject+request ()...ClientProxy-realSubject: RealSubject+preRequest ()+request ()+postRequest ()...preRequest();realSubject.request();postRequest();RealSubjectrealSubject+request ()... ? 代理模式的优点在于能够协调调用者和被调用者,在一定程度上降低了系统的耦合
度;其缺点在于由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,并且实现代理模式需要额外的工作,有些代理模式的实现非常复杂。 ? 模式适用环境
? 根据代理模式的使用目的,代理模式有以下几种类型(续):
? 保护(Protect or Access)代理:控制对一个对象的访问,可以给不同的
用户提供不同级别的使用权限。
? 缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,
以便多个客户端可以共享这些结果。
? 防火墙(Firewall)代理:保护目标不让恶意用户接近。
? 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而
没有冲突。
? 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额
外的操作,如将此对象被调用的次数记录下来等。
第23章_观察者模式
? 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每
当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
? 典型的抽象目标类代码如下所示:
import java.util.*;
public abstract class Subject {
protected ArrayList observers = new ArrayList(); public abstract void attach(Observer observer); public abstract void detach(Observer observer); public abstract void notify(); }
? 典型的具体目标类代码如下所示:
public class ConcreteSubject extends Subject { public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notify() { for(Object obs:observers) { ((Observer)obs).update(); } }