Wetts's blog

Stay Hungry, Stay Foolish.

0%

迭代器模式(Iterator Pattren)

定义:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。)

一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发。

适配器模式(Adapter Pattern)

又叫做变压器模式。也叫做包装模式(Wrapper)。

定义:Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)


适配器模式的优点:

  • 适配器模式可以让两个没有任何关系的类在一起运行;
  • 增加了类的透明性;
  • 提高了类的复用度;
  • 灵活性非常好。

适配器模式的使用场景:

  • 动机修改一个已经投产中的接口时。

适配器模式的注意事项:

  • 最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目的问题。

策略模式(Sstategy Pattern)

也叫做政策模式(Policy Pattern)

定义:Define a family of algorithms, encapsulate each one, and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)


策略模式的优点:

  • 算法可以自由切换;
  • 避免使用多重条件判断;
  • 扩展性良好。

策略模式的缺点:

  • 策略类数量增多;
  • 所有的策略类都需要对外暴露。

策略模式的使用场景:

  • 多个类只有在算法或行为上稍有不同的场景;
  • 算法需要自由切换的场景;
  • 需要屏蔽算法规则的场景。

装饰模式(Decorator Pattern)

定义:Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)

装饰类的作用也就是一个特殊的代理类。


装饰模式的优点:

  • 装饰类和被装饰类可以独立发展,而不会相互耦合;
  • 装饰模式是继承关系的一个代替方案;
  • 装饰模式可以动态地扩展一个实现类的功能;
  • 扩展性非常好。

装饰模式的缺点:

  • 多层的装饰是比较复杂的。

命令模式(command pattern)

定义:Encapsulate a request as an object, thereby letting you patameterize clients with different requests, queue or log requests, and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

命令模式是一个高内聚的模式。


命令模式的优点:

  • 类间解耦;
  • 可扩展性;
  • 命令模式结合其他模式会更优秀。

命令模式的扩展:

  • 在没有执行或执行后撤回
  • 结合备忘录模式还原最后状态;通过增加一个新的命令,实现时间的回滚。

命令模式(command pattern)

定义:Encapsulate a request as an object, thereby letting you patameterize clients with different requests, queue or log requests, and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

命令模式是一个高内聚的模式。


命令模式的优点:

  • 类间解耦;
  • 可扩展性;
  • 命令模式结合其他模式会更优秀。

命令模式的扩展:

  • 在没有执行或执行后撤回
  • 结合备忘录模式还原最后状态;通过增加一个新的命令,实现时间的回滚。

中介者模式(Mediator)

定义:Define an object that encapaulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interation independently.(用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。)


中介者模式的优点:

  • 减少类间的依赖,把原有的一对多的依赖变成一对一的依赖,同事类依赖中介者,较少了依赖,当然同事也降低了类间的耦合。

中介者模式的缺点:

  • 使用不当时复杂程度会被放大。

中介者模式的实际应用:

  • 机场调度中心;
  • MVC框架;
  • 媒体网关;
  • 中介服务。

以下情况尝试使用中介者模式:

  • N个对象之间产生了相互的依赖(N>2);
  • 对各对象有依赖关系,但是依赖的行为尚不确定或者有发生改变的可能,在这种情况下一般建议采用中介者模式,降低变更引起的风险扩散;
  • 产品开发。

原型模式(Prototype Pattern)

定义:Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)

简单程度仅次于单例模式和迭代器模式。


原型模式的优点:

  • 性能优良;
  • 逃避构造函数的约束。

原型模式的使用场景:

  • 资源优化场景;
  • 性能和安全要求的场景;
  • 一个对象多个修改这的场景。

原型模式的注意事项:

  1. 构造函数不会被执行

一个实现了Cloneable并重写了clone方法的A,有一个无参构造或有参构造B,通过new关键字产生了一个对象S,在然后通过S.clone()方式产生了一个新的对象T,那么在对象拷贝时构造函数B是不会被执行的。

  1. 浅拷贝和深拷贝

Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝。

使用原型模式时,引用的成员变量必须满足两个条件才不会被拷贝:一是类的成员变量,而不是方法内变量;二是必须是一个可变的引用,而不是一个原始类型或不可变对象。

深拷贝:对私有的类变量进行独立的拷贝。

深拷贝和浅拷贝建议不要混合使用。

  1. clone和final两个冤家

对象的clone与对象内的final关键字是有冲突的。

代理模式(Proxy Pattern)

也叫委托模式,是一项基本设计技巧。

定义:Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。)


代理模式的优点:

  • 责任清晰;
  • 高扩展性;
  • 智能化。

  • 普通代理
  • 强制代理
  • 虚拟代理
  • 动态代理

在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。

Spring AOP是一个非常典型的动态代理。

代理类实现InvocationHandler

建造者模式(Builder Pattern)

也叫做生成器模式

定义:Separate the construciton of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)


建造者模式的优点:

  • 封装性;
  • 建造者独立,容易扩展;
  • 便于控制细节风险。

建造者模式的使用场景:

  • 相同的方法,不同的执行顺序,产生不同的时间结果时;
  • 多个不见或零件,都可以装配到一个对象中,但是产生的执行结果又不相同时;
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能;
  • 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时。

建造者模式的注意事项:

  • 建造者模式关注的是零件类型和装配工艺(顺序);而工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。