2. 设计模式
设计模式
- 结构型模式 (8种)
- 外观模式 (门面模式)
- 组合模式
- 装饰器模式
- 过滤器模式
- 行为模式 (12种)
- 观察者模式(发布订阅模式)
- 策略模式
- 迭代器模式
- 空对象模式
- 模板模式
- 责任链模式
- 创建型模式
- 工厂模式
- 抽象工厂模式
- 建造者模式
- J2EE模式
- 拦截器过滤模式
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. 空对象模式
空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还
创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
11. 模板模式
在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用场景:
(1) 在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
参考: