参考博客:
书籍- 图解设计模式
http://www.cnblogs.com/gaochundong/tag/Design%20Pattern/default.html?page=1
UML类图:
https://www.cnblogs.com/pangjianxin/p/7877868.html
总原则:开闭原则 (对拓展开放,对修改封闭)
- 单一职责:每个类实现单一职责,只能有一个原因会导致类变更。
- 里氏替换:子类可以替代父类。
- 依赖倒转:针对接口编程。
- 接口隔离:每个接口中不存在子类用不到却必须实现的方法,否则就要将接口拆分。
- 迪米特原则:对自己依赖的类知道的越少越好。(多private少public)
- 合用复用原则:多采用组合聚合,少采用继承。
是什么(文字+类图+组成的类),有什么好处(说明(分离了什么,应对了什么变化)+举例+不用此种设计模式会导致什么情况)
- 组合模式与装饰器模式的类图相似,在使用上的差别?(个人理解)
组合模式和装饰器模式都会有对象a引用对象b的情况,装饰器中引用对象b是为了装饰对象b的方法(在方法前后添加逻辑),组合模式是为了通过对象b的方法逻辑完成对象a的方法逻辑。
- 装饰器模式、代理模式、适配器模式的区别(个人理解)
装饰器模式:不改变方法签名,为了在原来方法逻辑前后添加逻辑。
代理模式:不改变方法签名,为了添加访问控制等逻辑。
适配器模式:改变方法签名,对原来函数的参数或者返回值做改变。
- 工厂和抽象工厂的区别:
工厂生产宝马两驱和宝马四驱。抽象工厂生产奔驰系列的配件和宝马系列的配件
- 抽象工厂和Builder的区别(个人理解):
Builder相当于在抽象工厂的基础上又封装了一层,抽象工厂模式中的工厂就是Builder中的Builder,在Builder外再次封装一个director,这样不仅可以控制产品的系列,还可以控制完整产品的调用顺序。
- 组合模式与责任链模式的区别(个人理解)
两个模式都有对外接口的一致性特性。组合模式强调的是嵌套结构,责任链模式强调的是责任的传递。
- State状态模式和Strategy策略模式的区别(个人理解)?
State和strategy目的都是封装某个可变的动作,state中的动作是和状态紧密相关的,而策略本身就是动作本身。
创建型模式(5种)
1.Factory工厂模式
每个产品对应一个工厂类。
好处:对用户隐藏构造函数的参数细节,应对构造函数的变化。
2. Abstract Factory抽象工厂
产品分为多个系列,每个系列一个工厂。
3.prototype原型模式;
预先创建一个对象,用对象的clone方法代替new方法。
4.Builder建造者:
目的是为了构造一个复杂的对象,builder中的多个方法分别负责构建复杂对象的多个组件。Director负责接收一个builder,使用builder构建组件,组装完成对象;builder负责生产组件,director负责组装。
5.单例模式:
保证程序中的某个类只有一个对象。
结构型模式(7种)
6. facade门面模式:
对一个子系统的功能功能封装成统一的接口,用facade类进行系统的分割。
好处:分隔系统;在façade中提供统一的接口,屏蔽内部逻辑关系,使其变得更加易用。
7.proxy代理模式:
在客户类和服务类之间加一个代理。
好处:可以在代理中加一些路由,过滤等功能;可以将一部分小逻辑放在代理人处,仅在必要时初始化真实类,延迟真实类的初始(在真实类的初始化特别复杂的情况下格外有用)。
8.adapter适配器模式:
将类封装成需要的类型,复用已有代码实现需求。
9.Composite组合模式:
树状结构的类结构,composite类内有多个component,component类中有多个leaf。三种类有一个统一的接口,使用composite类的方法后,链式触发component和leaf中的方法。好处:单个或多个entry下,对entry使用的一致性。比如下面例子中对文件夹和文件可以使用相同的api。
10.decorator装饰器模式:
为了在不继承的情况下,为component添加新的功能。Decorator内包装一个Component,decorator提供与component一样的方法,但是会在方法的执行前或者执行后增加一些行为。
11.bridge桥接模式:
例子-shape有方形,圆形;有红黄绿;只采用集成的话就会有2*3六种类(乘的关系)。桥接模式将在shape里面添加一个颜色的引用,就可以减少子类的数量。颜色和形状都是shape的子类,一共有5种子类(加的关系)。
12. Flyweight享元:
使用对象池,避免构建大量的小对象。
行为型模式(11种)
13.Template模板:
定义一个操作中算法的骨架,将骨架算法中分解出的小功能定义为抽象方法,实现拖延到子类中。
14. Memento备忘录:
为Originator类设计一个备忘Memento,在之后的操作中用Memento进行Originator内部状态的还原。Memento内只有需要备忘的字段和修改这些字段的函数。
originator的createMemento函数创建一个备份并作为返回值,restoreMemento(Memento)函数根据备份的数据还原状态。
15.observer观察者:
为Subject注册多个Observer,在Subject的状态发生改变的时候,subject调用notifyObservers,在notifyObservers中会依次调用每个observer的update(subject)方法,update(subject)方法内部会根据subject.getSucjectState()的返回结果进行某些操作。
使用Observer中的方法完成某些操作。
16.Chain of Responsibility职责链:
每个handler持有一个handler类型的后继,每个请求会依次被责任链中的多个handler进行处理。
好处:可以弱化请求的人和处理请求的人之间的联系,发出请求的人可以不用知道每一个handler。
17.Command命令:
client将请求封装到一个Command类中,Invoker执行command.execute(),command.execute()执行receiver的action。Receiver是动作的宾语,而不是动作结束后的被通知者。client和invoker可以是同一个类,也可以不是同一个。
好处:命令的生成和执行被分开,可以实现请求排队、撤销操作、异步执行等。
18.state状态:
context的行为跟内部state紧密相关,则将state抽象为一个类,将context的动作放到state类中。例如汽车的启动动作跟有没有油这个状态紧密相关,那么就将汽车启动这个动作放入油量state中。
19. Strategy策略:
将Context中变化的动作封装成新的Strategy类,使得算法可独立于使用它的客户而变化。
20. Mediator中介者:
Mediator类协调各个Colleague之间的协作。
某个colleague的某个方法被触发,调用mediator.colleagueChanged( ),mediator实现一些逻辑调用某些colleague的controlColleague方法(这里control的是自己,不是别的colleague)
21. Interpreter解释器:
context中存储着需要被翻译的表达式,提供hasMoreToken和nextToken函数,expression中的parse(context)函数解析context的一部分token,并把剩余的context内容传递给嵌套的expression(需要注意类图中的expression是有嵌套结构的)。
22. Visitor访问者:
集合类接受一个visitor,遍历调用集合内部element的accept方法,accept方法中调用对应的visitor.visitXX(element)方法。这样一个好处是将访问动作与element分离,应对不可知的访问动作。
element中通常会有一个集合,在accept方法中一般写visitor.visit(this),遍历集合的逻辑实现在visitor.visit()中。
23.iterator迭代器:
提供模式顺序迭代某个集合。
好处:将Aggregator内部集合的实现方式和对集合的遍历方法进行分离。当集合的表示方式发生变化时,对Aggregator的遍历方式不会发生改变。
设计模式的应用
- 单例模式:基本上在每一个流行的项目中都会有应用。
- 工厂模式:
- 抽象工厂:
- 原型模式:
- 建造者:
- 代理:spring对于request作用域的实现使用的就是代理模式,代理类中会添加是否获取新的bean的逻辑。
- 门面:
- 适配器:maven的Node适配器;
- 享元:java的线程池的基本思想;riddle中的jar包;
- 组合:
- 桥接
- 装饰器:过滤器一类的流使用的是装饰器模式。
- 模板:AQS;当dog系统回退的时候,book的复制算法是抽象的;evosuite的流程用的模板
- 责任链:过滤垃圾关系;springMvc的filter应该使用了责任链模式。
- 观察者:界面编程中的Listener,国网充电桩项目;
- 备忘录
- 状态
- 策略:Comparator
- 中介者:
- 命令:quartz,
- 解释器:
- 访问者:maven的依赖树api使用了visitor设计模式。
- 迭代器: