尚学堂视频笔记
行为型模式:关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责
命令、解释、访问者用的较少,共11种
责任链模式:chain of responsibility
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能处理则处理,如果不能则传递给链上的下一个对象。
比if else好在哪?
修改流程时要改源代码,且语句过多,增加了程序复杂程度
需要自行设定链接关系,也可以用数组、配置文件等生成链接关系,或者集合中迭代遍历
常见场景:java中,异常机制
javascript语言中,事件的冒泡和捕获机制。java语言中,事件的处理采用的是观察者模式
servlet开发中,过滤器的链式处理
struts2,拦截器的调用
迭代器模式:iterator
——提供一种可以遍历聚合对象的方式
结构:聚合对象(存储数据),迭代器(遍历数据)
场景:jdk内置的迭代器,内部类实现
中介者模式:mediator
和外观模式、适配器模式的区别是?
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
命令模式:command
——将一个请求封装为一个对象,从而使我们可用不同的请求对客户端进行参数化;对请求排队或者记录请求日子,以及支持可撤销的操作。
如事物的底层实现用到该模式
解释器模式:interpreter 开发新语言时会用到
——不同寻常的设计模式
——用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解时期设计。
——尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中,可以使用jruby,groovy,java的js引擎来代替解释器的作用,弥补java语言的不足。
常见场景:el表达式、正则表达式、sql语法、数学表达式
访问者模式:visitor(应用范围非常窄,了解即可)
模式动机:对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公有的接口),对于该集合中的对象,可以接受一类称为访问这的对象俩访问,不同访问者其访问方式也有所不同。
定义:表示一个作用于对象结构总的各元素的操作,它使我们可以在不改变元素的类的前提下定义作用于这些元素的新操作
场景:xml文档解析器设计,编译器设计,复杂集合对象的处理
(关键点: 数据结构不变的前提下, 访问者对象根据 数据结构的数量 来定义访问方法数量, 有2个数据结构就定义2个方法, 3个数据结构就是3个方法; 新增访问者很方便; 即固定数量的数据结构对应多个访问者;
不同于策略模式需要手动选择策略, 如果用策略模式来实现, 则变成了 数据结构+访问者+访问者策略, 增加了类的数量 )
策略模式:strategy
场景:商品折扣,普通客户,会员的打折优惠等
——解决某一个问题的一个算法族
分离算法,实现分离
gui编程布局管理
spring框架中,Resource接口,资源访问策略
javax.servlet.http.HttpServlet#service()
策略模式 VS 状态模式 策略模式 VS 状态模式 | 菜鸟教程
组合的运用能够比 继承更加灵活; 经常和模板方法模式一起使用;
(有点在继承体系中多态的感觉, 但基于接口的方式能更好的解耦)
策略模式与状态模式的区别?
策略模式: 需要手动的选择算法策略, 除非搭配简单工厂; 策略模式是完全符合开闭原则的
状态模式: 不需要关注状态的改变, 但新增状态是需要修改原有类的
除此之外2者很相似
状态模式:state(可参考:设计模式 ( 十七) 状态模式State(对象行为型)_黄规速博客:学如逆水行舟,不进则退-CSDN博客_状态模式)
如电梯的运行:正常,自动关门,自动开门,向上,向下,维修,消防状态
红绿灯:红灯,绿灯,黄灯
网上购物时,订单的状态:下单,付款,已发货,送货中,已收货
不同的状态使用不同的行为应对
核心:解决系统中复杂对象的状态转换以及不同状态下的行为封装问题
关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。
后记: 状态模式在处理一种状态的复杂流转时, 调用方不用管状态的变更, 状态是自动流转的, 消除了switch的语法;
但如果有多种状态, 则代码会变得复杂
Object-Oriented Patterns: A Simplified Look at State Patterns in Java - DZone Java (案例中自行车的升档,降档切换, 是非常好理解的状态模式)
模版方法模式:template method(重要)
定义一个操作中的算法骨架,将某些步骤延迟到子类中实现。(装饰器?)
核心:处理步骤父类中定义好,具体实现延迟到子类中定义
模版调用顺序的方法将被final修饰不能被子类修改
(多态的运用,使用匿名内部类实现步骤,可便捷的改变实现)
——实现一个算法时,整体步骤很固定,但是,某些部分易变。易变部分可以抽象出来,供子类实现。
场景:非常频繁,数据库访问的封装,junit单元测试,servlet中的doGet/doPost
Hibernate中的模版程序
spring中的JDBCTemplate,HibernateTemplate
观察者模式:observer
广播机制的场景,servlet监听器的实现,聊天室群发消息,网络游戏的多人联机对战
用一个list维护观察者名单,提供list的register、remove方法、notify方法,遍历list成员达到通知效果。
javase提供了Observable Observer接口
备忘录模式:memento
场景:录入大批数据时,输错了上一个数据,需要恢复后再修改
word电脑的断电,再打开时,提示恢复到以前的状态
管理系统中,公文发出去后,想撤回的功能。
核心:保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原型的状态
源发器Originator
备忘录类Memento
负责人类CareTake
多次备忘可使用容器,或者栈Stack,或者序列化,持久化
场景:棋类游戏的悔棋,文档编辑中的撤销,数据库中的回滚等