Fork me on GitHub

设计模式一揽子

推荐阅读:设计模式 菜鸟教程

代理模式

场景:

远程代理:为一个对象在不同的地址空间提供局部代表。
虚代理:根据需要创建开销很大的对象。
保护代理:控制对原始对象的访问。保护代理用于对象应该有不同访问权限的时候。
智能指引:取代了简单的指针,它在访问对象时执行了一些附加操作,如下:

  • 对指向实际对象的引用计数,这样当该对象没有引用的时候,可以自动释放它。
  • 当第一次引用一个持久对象时,将它装入内存。
  • 在访问一个实际对象前,检查时候已经锁定了它,以确保其他对象不能改变它。

虚拟代理

  • 未使用代理模式时:
    • 使用 JDBC 与 MySQL 交互时,需要创建数据库链接,开销大。
  • 使用代理模式的虚拟代理:
    • 让虚拟代理做“创建开销大的对象”的工作,把创建这类对象的工作推迟到使用它的时候
    • 每一张数据表,对应一个代理类。
    • 当出现请求,想操作数据表时,这时代理类将创建对象,并完成对数据库的操作。
      • 操作数据表,相当于一个 AdminDAO 接口,对应实现 AdminDAOImpl。
      • 代理类,即 AdminDaoProxy,同样 implements 了 AdminDAO 接口,而且。

动态代理:

代理1

  • User 调用 Proxy,Proxy 实现 Subject 接口 plan 相关功能,某Invocation实际去 achieve 这些功能。
    • 此 InvocationHandler 实际上implements InvocationHandler 接口,并重写invoke()方法。

代理模式的变体

防火墙代理、缓存代理、智能引用代理、同步代理(多线程)、写入时复制代理(copy-on-write)。

  • copy-on-write:该优化根据需要创建的对象有关,用代理延迟拷贝的过程,因为它没有被修改的时候,没有必要因为拷贝而产生开销。只有用户请求修改实体的操作时,代理才会真正拷贝它

工厂模式

参考:面经整理2,第5题

策略模式

  1. 有一系列算法,一个算法称为一个策略,将每一个都封装起来,让它们可以相互替换。
    • 这些策略都 implements 了 Strategy 接口,拥有同名方法(例 operation)的不同实现。
  2. 策略模式让算法独立于使用它的客户,然后根据环境或者条件的不同选择不同的策略来完成该项任务。
    • 环境 context 类中有一个指向 Strategy 接口的引用。
    • psvm 中会传入带有不同条件(通常指明了某实现类)的 context,然后让 context 执行 operation(由此自然定位到了预想的实现类中,执行预想的实现方法)。
  3. 当算法被调用, Context 可以将该算法所需要的所有数据都传递给该 Strategy ,或者, Context 可以将自身作为一个参数传递给 Strategy 操作。这就让 Strategy 在需要的时候可以回调 Context。
  • 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
  • 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

策略模式的缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

享元模式

对比策略模式:

  • 享元模式与策略模式极其类似,一般是在策略模式外包一层对象,但享元模式属于结构型模式,而策略模式属于行为型模式。

建议直接看这篇博客:初探享元模式,清晰易懂。

flyweight

外观模式(Facade Pattern)

  • 多个子系统,每一个都很细碎复杂,有时候客户并不需要知道太细节的东西。
  • 给子系统们增加一个简单接口 Facade,Facade 可以提供一个简单的缺省视图,这一视图对大多数用户而言已经足够,而需要定制的用户则可以通过 Facade 层来使用子系统。

此模式的参与者:

Facade : 知道哪些子系统负责处理请求,将用户的请求恰当发送。
Subsystem classes:实现子系统的功能,处理 Facade 指派。

facade

-------------The End-------------