设计模式
- 结构型模式 (8种)
- 门面模式(外观模式)
- 组合模式
- 装饰器模式
- 行为模式 (12种)
- 观察者模式(发布订阅模式)
- 策略模式
- 迭代器模式
- 空对象模式
- 创建型模式
- 工厂模式
- 抽象工厂模式
- 建造者模式
1. 门面模式
门面模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。
为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。
使用场景:
(1) 为复杂的模块或子系统提供外界访问的模块;
(2) 子系统相互独立;
(3) 在层析结构中,可以使用外观模式定义系统的每一层的入口。
使用方法:
参考: 、
2. 观察者模式
观察者模式(Observer)就是在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
微信工作号为 —— 主题/被观察者(Subject)
订阅者 —— 观察者(Observer)
使用场景:
有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。
使用方法:
参考:、
3. 策略模式
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,
从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式把一个系列的算法封装到一个系列的具体策略类里面,作为一个抽象策略类的子类或策略接口的实
现类。简单地说:准备一组算法,并将每一个算法封装起来,使它们可以互换。
使用场景:
商城打折、会员vip
使用方法:
参考: 、
4. 工厂模式
工厂模式主要是为了解决接口选择的问题,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
使用场景:
(1)日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方;
(2)数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时;
使用方法:
参考:
5. 抽象工厂模式
抽象工厂相当于一个超级工厂,是创造其他工厂的工厂。
使用场景:
使用方法:
6. 组合模式
用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
使用场景:
树形结构
使用方法:
7. 装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
使用场景:
(1) 扩展一个类的功能;(2) 动态增加功能,动态撤销;
使用方法:
8. 迭代器模式
迭代器模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。该模式提供一种方法顺序
访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。一般情况,我们自己开发时很少自定义迭代器,
因为java本身已经把迭代器做到内部中了(比如:常用的list和set中都内置了迭代器)。当然,如果真有这种需
求需要我们自定义迭代器的话,可以参考jdk的迭代器实现方式来实现自己的迭代器。
使用场景:
(1) 访问一个聚合对象的内容而无须暴露它的内部表示;
(2) 需要为聚合对象提供多种遍历方式;使用方法:
9. 建造者模式
建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。
10. 空对象模式
空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还
创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。