《Head First设计模式》设计模式总结

前言:如果你被标题骗进来,直接拉到最后查看参考链接即可。

策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

例子

编写各种各样的鸭子类,定义基本的行为呱呱叫(quack)、游泳(swim)、展示(display)。

使用继承

创建超类Duck,此超类中有swim和quack的具体实现方法,有一个抽象方法display,继承的子类就自动有了swim和quack的方法。

问题:如果在Duck超类中添加一个飞行(fly)方法,那么会导致某些不能飞的鸭子变得能飞,或者需要把那些不能飞的子类都要修改一遍。

使用接口

创建超类Duck,但此类中无fly方法,单独开一个接口Flyable,只有会飞的鸭子才实现这一接口。

问题:导致大量飞行行为一致的鸭子类都要重新实现一套一样的fly方法,代码无法复用。

设计原则

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起

应用此设计原则,将fly的实现提取出来,根据飞行的不同,创建多个飞行类代表每种不同的飞行行为。

针对接口编程而不是针对对实现编程

如何实现独立出来的飞行方法呢?定义一个FlyBehavior的接口,具体的飞行类都实现此接口,而在Duck中添加此接口的成员,并实现performFly。

观察者模式

装饰者模式

工厂模式

单件模式

命令模式

适配器模式与外观模式

模板方法模式

迭代器与组合模式

状态模式

代理模式

为另一个对象提供一个替身或占位符以控制对这个对象的访问

其它类型的代理

远程代理

在实际中常常需要进行网络通信,如果能够像调用本地类一样调用远程方法,那将十分方便,而远程代理即提供了这种能力。

他在本地建立一个stub对象,这个stub对象与远程要访问的对象有着一样的调用接口,所以可以通过这个stub对象来代理远程对象的访问。

虚拟代理

虚拟代理一般代理创建开销大的对象。在大对象准备好之前,都将请求打到这个代理对象。

例如在加载组件的时候,组件的icon是通过网络下载的,所以在真正显示icon之前,是有一个代理类来显示这个icon的。

动态代理

java中的动态代理,是在运行时创建代理类,提供了很大的灵活性。

其它代理

防火墙代理:控制网络的资源访问,保护主题免于坏客户的侵害。

智能引用代理:当主题被引用时,进行额外的动作,例如计算一个对象被引用 的次数。

缓存代理:为开销大的运算结果提供暂时存储:它也允许多个客户端共享结果,以减少计算或网络延迟。

同步代理:在多线程的情况下为了主题提供安全的访问。

复杂隐藏代理:用于隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称之为外观代理。

写时复制代理:用于控制对象的复制,方法是延迟对象的复制,直到真正需要。

复合模式

桥接模式

生成器模式(Builder Pattern)

责任链模式(Chain of Responsibility Pattern)

中介者模式(Mediator Pattern)

备忘录模式(Memento Pattern)

原型模式(Prototype pattern)

访问者模式

参考链接:

https://xiaochai.github.io/2019/08/04/head-first-design-patterns/

猜你喜欢

转载自blog.csdn.net/Candyys/article/details/108802202