0-设计模式

参考博客:

书籍- 图解设计模式

http://www.cnblogs.com/gaochundong/tag/Design%20Pattern/default.html?page=1

UML类图:

https://www.cnblogs.com/pangjianxin/p/7877868.html

总原则:开闭原则 (对拓展开放,对修改封闭)

  1. 单一职责:每个类实现单一职责,只能有一个原因会导致类变更。
  2. 里氏替换:子类可以替代父类。
  3. 依赖倒转:针对接口编程。
  4. 接口隔离:每个接口中不存在子类用不到却必须实现的方法,否则就要将接口拆分。
  5. 迪米特原则:对自己依赖的类知道的越少越好。(多private少public)
  6. 合用复用原则:多采用组合聚合,少采用继承。

是什么(文字+类图+组成的类),有什么好处(说明(分离了什么,应对了什么变化)+举例+不用此种设计模式会导致什么情况)

 

  1. 组合模式与装饰器模式的类图相似,在使用上的差别?(个人理解)

组合模式和装饰器模式都会有对象a引用对象b的情况,装饰器中引用对象b是为了装饰对象b的方法(在方法前后添加逻辑),组合模式是为了通过对象b的方法逻辑完成对象a的方法逻辑。

  1. 装饰器模式、代理模式、适配器模式的区别(个人理解)

装饰器模式:不改变方法签名,为了在原来方法逻辑前后添加逻辑。

代理模式:不改变方法签名,为了添加访问控制等逻辑。

适配器模式:改变方法签名,对原来函数的参数或者返回值做改变。

  1. 工厂和抽象工厂的区别:

工厂生产宝马两驱和宝马四驱。抽象工厂生产奔驰系列的配件和宝马系列的配件

  1. 抽象工厂和Builder的区别(个人理解):

Builder相当于在抽象工厂的基础上又封装了一层,抽象工厂模式中的工厂就是Builder中的Builder,在Builder外再次封装一个director,这样不仅可以控制产品的系列,还可以控制完整产品的调用顺序。

  1. 组合模式与责任链模式的区别(个人理解)

两个模式都有对外接口的一致性特性。组合模式强调的是嵌套结构,责任链模式强调的是责任的传递。

  1. State状态模式和Strategy策略模式的区别(个人理解)?

Statestrategy目的都是封装某个可变的动作,state中的动作是和状态紧密相关的,而策略本身就是动作本身。

  1.  

 

创建型模式(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内包装一个Componentdecorator提供与component一样的方法,但是会在方法的执行前或者执行后增加一些行为。

11.bridge桥接模式:

例子-shape有方形,圆形;有红黄绿;只采用集成的话就会有2*3六种类(乘的关系)。桥接模式将在shape里面添加一个颜色的引用,就可以减少子类的数量。颜色和形状都是shape的子类,一共有5种子类(加的关系)。

12. Flyweight享元:

使用对象池,避免构建大量的小对象。

行为型模式(11种)

13.Template模板:

定义一个操作中算法的骨架,将骨架算法中分解出的小功能定义为抽象方法,实现拖延到子类中。

14. Memento备忘录:

Originator类设计一个备忘Memento,在之后的操作中用Memento进行Originator内部状态的还原。Memento内只有需要备忘的字段和修改这些字段的函数。

originatorcreateMemento函数创建一个备份并作为返回值,restoreMemento(Memento)函数根据备份的数据还原状态。

15.observer观察者:

Subject注册多个Observer,在Subject的状态发生改变的时候,subject调用notifyObservers,在notifyObservers中会依次调用每个observerupdatesubject)方法,updatesubject)方法内部会根据subject.getSucjectState()的返回结果进行某些操作。

使用Observer中的方法完成某些操作。

16.Chain of Responsibility职责链:

每个handler持有一个handler类型的后继,每个请求会依次被责任链中的多个handler进行处理。

好处:可以弱化请求的人和处理请求的人之间的联系,发出请求的人可以不用知道每一个handler

17.Command命令:

client将请求封装到一个Command类中,Invoker执行command.execute(),command.execute()执行receiveractionReceiver是动作的宾语,而不是动作结束后的被通知者clientinvoker可以是同一个类,也可以不是同一个。

好处:命令的生成和执行被分开,可以实现请求排队、撤销操作、异步执行等。

 

18.state状态:

context的行为跟内部state紧密相关,则将state抽象为一个类,将context的动作放到state类中。例如汽车的启动动作跟有没有油这个状态紧密相关,那么就将汽车启动这个动作放入油量state中。

19. Strategy策略:

Context中变化的动作封装成新的Strategy类,使得算法可独立于使用它的客户而变化。

 

 

20. Mediator中介者:

Mediator类协调各个Colleague之间的协作。

某个colleague的某个方法被触发,调用mediator.colleagueChanged( )mediator实现一些逻辑调用某些colleaguecontrolColleague方法(这里control的是自己,不是别的colleague

21. Interpreter解释器:

context中存储着需要被翻译的表达式,提供hasMoreTokennextToken函数,expression中的parsecontext)函数解析context的一部分token,并把剩余的context内容传递给嵌套的expression(需要注意类图中的expression是有嵌套结构的)。

22. Visitor访问者:

集合类接受一个visitor,遍历调用集合内部elementaccept方法,accept方法中调用对应的visitor.visitXX(element)方法。这样一个好处是将访问动作与element分离,应对不可知的访问动作。

element中通常会有一个集合,在accept方法中一般写visitor.visit(this),遍历集合的逻辑实现在visitor.visit()中。

23.iterator迭代器:

提供模式顺序迭代某个集合。

好处:将Aggregator内部集合的实现方式和对集合的遍历方法进行分离。当集合的表示方式发生变化时,对Aggregator的遍历方式不会发生改变。

设计模式的应用

  1. 单例模式:基本上在每一个流行的项目中都会有应用。
  2. 工厂模式:
  3. 抽象工厂:
  4. 原型模式:
  5. 建造者:
  6. 代理:spring对于request作用域的实现使用的就是代理模式,代理类中会添加是否获取新的bean的逻辑。
  7. 门面:
  8. 适配器mavenNode适配器
  9. 享元:java的线程池的基本思想;riddle中的jar
  10. 组合:
  11. 桥接
  12. 装饰器:过滤器一类的流使用的是装饰器模式。
  13. 模板:AQSdog系统回退的时候,book的复制算法是抽象的evosuite的流程用的模板
  14. 责任链:过滤垃圾关系springMvcfilter应该使用了责任链模式。
  15. 观察者:界面编程中的Listener国网充电桩项目;
  16. 备忘录
  17. 状态
  18. 策略:Comparator
  19. 中介者:
  20. 命令:quartz,
  21. 解释器:
  22. 访问者:maven的依赖树api使用了visitor设计模式。
  23. 迭代器:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值