前言:如果你被标题骗进来,直接拉到最后查看参考链接即可。
策略模式
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
例子
编写各种各样的鸭子类,定义基本的行为呱呱叫(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/