Wetts's blog

Stay Hungry, Stay Foolish.

0%

桥梁模式(Bridge Pattern)

定义:Decouple an abstraction from its implementation so that the two can vary independently.(将抽象和实现解耦,使得两者可以独立地变化。)


桥梁模式的优点:

  • 抽象和实现分离;
  • 优秀的扩充能力;
  • 实现细节对客户透明。

桥梁模式的使用场景:

  • 不希望或不适用使用继承的场景;
  • 接口或抽象类不稳定的场景;
  • 重用性要求较高的场景。

享元模式(Flyweight Pattern)

定义:Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象。)


要求细粒度对象,那么不可避免地使得对象数量多切性质相近,那我们就将这些对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。

  • 内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变。
  • 外部状态是独享得以依赖的一个标记,是随环境改变而改变的、不可用共享的状态。

解释器模式(Interpreter Pattern)

Given a language, define a representation for its grammer along with an interpreter that uses the representation to interpret sentences in the language.(给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子)


解释器模式优点:它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要增加非终结符类就可以了。


解释器模式缺点:

  • 会引起类膨胀
  • 采用递归调用方法
  • 效率问题

解释器模式使用场景:

  • 重复发生的问题
  • 一个简单语法需要解释的场景

双接口设计,我们的一个类可以实现多个接口,在系统设计时,如果考虑对象的安全问题,则可以提供两个接口,一个是业务的正常接口,实现必要的业务逻辑,叫做宽接口;另外一个接口是一个空接口,说明方法都没有,其目的是提供给子系统外的模块访问,比如容器对象,这个叫做窄接口,由于窄接口中没有提供任何操纵数据的方法,因此相对来说比较安全。

状态模式

定义:Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.(当一个对象在状态改变时允许其改变行为,这个对象看起来像改变了其类。)


状态模式的优点:

  • 结构清晰;
  • 遵循设计原则;
  • 封装性非常好。

状态模式的缺点:

  • 子类太多,类膨胀。

状态模式的使用场景:

  • 行为随状态变化而变化的场景;
  • 条件、分支判断语句的替代者。

访问者模式(Visitor Pattern)

定义:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.(封装一些作用于某些数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。)


访问者模式的优点:

  • 符合单一职责原则;
  • 优秀的扩展性;
  • 灵活性非常高。

访问者模式的缺点:

  • 具体元素对访问者公开细节;
  • 具体元素角色的增加、删除、修改都是比较困难的;
  • 违背了依赖倒置原则。

访问者模式的使用场景:

  • 业务规则要求遍历多个不同的对象;
  • 充当拦截器角色。

备忘录模式(Memento Pattern)

定义:Without violating encapsulation, capture and externalize an object,s internal state so that the object can be restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。)


备忘录模式的使用场景:

  • 需要保存和恢复数据的相关状态场景;
  • 提供一个可回滚(rollback)的操作;
  • 需要监控的副本场景;
  • 数据库连接的事物管理就是用的备忘录模式。

门面模式(Facade Pattern)

定义:Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使子系统更易于使用。)


门面模式的优点:

  • 减少系统的相互依赖;
  • 提高了灵活性;
  • 提高安全性。

门面模式的缺点:

  • 不符合开闭原则。

门面模式的使用场景:

  • 为了一个复杂的模块或子系统提供一个供外界访问的接口;
  • 子系统相对独立—外界对子系统的访问只要黑箱操作即可;
  • 预防低水平人员带来的风险扩散。

观察者模式(Observer Pattern)

也叫做发布订阅模式(Publish/subscribe)

定义:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)


观察者模式的优点:

  • 观察者和被观察者之间是抽象耦合;
  • 建立一套出发机制。

观察者模式的缺点:

  • 观察者模式需要考虑一下开发效率和运行效率问题,一个被观察者,多个观察者,开发和调试就会比较复杂,而且在Java中消息的通知默认是顺序执行,一个观察者卡壳,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。
  • 多级触发时的效率更是让人担忧。

观察者模式的使用场景:

  • 关联行为场景;
  • 事件多级触发场景;
  • 跨系统的消息交换场景。

观察者模式的注意事项:

  • 使用观察者模式也有以下两个重点问题要解决:
  • 广播链问题;
  • 异步处理问题。

Java中的观察者类:

  • java.util.Observable 被观察者
  • java.util.Observer 观察者

系统设计中会对观察者模式进行改造或改装,主要在以下3个方面:

  • 观察者和被观察者之间的消息沟通:观察者中的update方法接受两个参数,一个是被观察者,一个是DTO(Data Transfer Object,数据传输对象),DTO一般是一个纯洁的JavaBean,由被观察者生成,由观察者消费。
  • 观察者响应方式:一是采用多线程技术;而是缓存技术。
  • 被观察者尽量自己做主。

在实际项目和生活中经常发生的例子:

  • 文件系统;
  • 猫鼠游戏;
  • ATM取钱;
  • 广播收音机。

组合模式(Composite Pattern)

也叫合成模式,有时又叫做部分-整体模式(Part-Whole)

定义:Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.(将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。)


组合模式的优点:

  • 高层模块调用简单;
  • 节点自由增加。

组合模式的使用场景:

  • 维护和展示部分-整体关系的场景;
  • 从一个整体中能够独立出部分模块或功能的场景。