第六周作业

设计模式——行为型模式

策略模式(Strategy 

简介:
  策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为与环境分开,将算法的定义放在专门的策略类汇总,每一个策略类封装了一种实现算法,使用算法的环境类针对抽象策略类进行编程,符合“依赖倒转原则”。


2.状态模式(State
概论:
  状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。

适用场景:
  对象的行为依赖于它的状态(如某些属性值),状态的变化将导致行为的变化
在代码中包含大量和对象状态有关的条件语句,导致代码的可维护性和灵活性变差,不能方便的增加和删除状态,并且导致客户类与类库之间的耦合增强

优缺点:
  优点:
    封装了状态的转换原则,可以对状态转换代码进行集中管理,而不是分散在一个个业务方法中
    将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境对象拥有不同的行为
    允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块

缺点:
    状态模式必然会增加系统中类和对象的数量,导致运行开销增大;
    状态模式的结构与实现都比较复杂,使用不当容易导致程序结构与代码的混乱,增加设计的难度;
    状态模式对“开闭原则”支持不太好,增加新的状态需要修改负责状态维护的代码;

3. 责任链模式(Chain Of Responsibility
描述:
  责任链模式是一种对象的行为模式。在责任链模式中,对象持有下家的引用而连接成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上哪个对象最终处理这个请求,使得系统可以在不影响客户端的情况下动态的重新组织和分配责任。
纯与不纯的责任链:
  纯责任链:要么处理请求,要么交给下家处理;不允许具体处理对象承担了一部分责任之后,又向下传递;一个请求必须被某一个处理对象所接收
  不纯的责任链:纯的责任链很少见,能看到的基本上都是不纯的。
4.解释器模式(Interpreter
描述:
  解释器模式为自定义语言的设计和实现提供了一种解决方案,他用于定义一组文法规则并通过这组文法规则来解释语言中的句子。
优点:
  易于改变和扩展文法。在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法;
  每一条文法规则都可以表示为一个类,因此可以方便的实现一个简单的语言;

4. 命令模式(Command
描述:
  命令模式属于对象的行为模式,又称行动(Action)模式或者交易(Transaction)模式
  命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供撤销、恢复功能
6.观察者模式(Observer
简介:
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式,模型-视图(Model/View)模式,源-监听器(Source/Listener)模式或者从属者(Dependents)模式。
7.备忘录模式(Memento
备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。
8.迭代器模式(Iterator
9.模板方法模式(Template Method
10.访问者模式(Visitor
11.中介者模式(Mediator

这十一种策略模式共可分为四类:
第一类:通过父类与子类的关系进行实现。(1)策略模式(2)模板方法模式
第二类:两个类之间。(3)观察者模式(4)迭代子模式(5)责任链模式(6)命令模式
第三类:类的状态。(7)备忘录模式(8)状态模式
第四类:通过中间类(9)访问者模式(10)中介模式(11)解释器模式

状态模式

状态模式允许一个对象在其状态改变时,改变它的行为,典型应用就是替代if-else语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来约束它们

状态和行为是关联的,它们的关系可以描述为:状态决定行为

 

策略模式

策略模式定义了一些列的算法,把它们一个个地封装起来,并且使它们可以相互替换。策略模式使得算法可以独立于使用它的客户而变化
策略模式的本质:分离算法,选择实现


与状态模式的对比:
  两个模式从模式结构上看是一样的,但是实现的功能不一样。状态模式是根据状态的变化来选择相应的行为,不同的状态对应不同的类,每个状态对应的类实现了该状态对应的功能,在实现功能的同时,还会维护状态数据的变化。这些实现状态对应的功能的类之间是不能相互替换的

策略模式是根据需要来选择相应的实现类,各个实现类是平等的,是可以替换的。

 

模板方法模式

模板方法模式定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
模板模式的使用非常简单,仅仅使用了Java的继承机制,但是它是一个应用非常广的模式

 

观察者模式

观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象检查一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者能够自动更

Java提供对观察者模式的支持

Observer接口
  该接口定义了一个update()方法,当被观察者对象的状态发生变化时,这个方法就会被调用

Observable接口
  被观察者都是java.util.Observable的子类,该类提供公开的方法支持观察者对象,有两个方法很重要:setChanged(),该方法被调用后会设置一个内部标识变量,代表被观察者对象的状态发生了变化;另一个是notifyObservers(),这个方法被调用时,会调用所有登记过的观察者对象的update()方法,使这些观察者对象可以更新自己;还有addObserver()、deleteObserver()等方法用于登记观察者、清除观察者

 

迭代器模式

迭代器模式提供一种方法 访问一个容器对象中的各个元素,而又不暴漏该对象的内部细节

 

责任链模式

责任链模式说的通俗一点就是,当客户提交一个请求时,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者

  链上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象

命令模式

命令模式通过一个Command的类封装了对目标对象的调用行为以及调用参数。将一个请求封装成一个对象,从而使我们可以用不同的请求对用户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,Struts框架其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想

命令模式的本质就是封装请求

 

开机问题,操作者通过按下机箱上的一个按钮(启动、重启、关闭等),然后机箱通知主板执行相关的操作,这一列些行为就是一个典型的命令模式的实现用户不想与主板直接打交道,而用户根本不知道具体的主板是什么,用户只希望按下按钮,电脑就会执行正常的启动、关闭等操作,换了主板用户还是一样按下按钮就可以了,用户和主板应该完全解耦
这就需要在用户和主板之间建立一个中间对象了,用户发出的命令传递给这个中间对象,然后由这个中间对象去找真正的执行者。很显然,这个中间对象就是上面的命令对象

 

备忘录模式

备忘录模式是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

白箱备忘录模式

备忘录角色对任何对象都提供一个接口,即宽接口,通过该接口,备忘录角色内部所有存储的状态就对所有对象公开,因此这个实现又称为白箱实现

白箱实现将发起人角色的状态存储在一个大家都能看到的地方,因此是破坏封装性的,但是仍然是有实用意义的

黑箱备忘录模式

备忘录角色对发起人角色提供一个宽接口,而对其他对象提供一个窄接口
Java语言中,实现双重接口的办法就是将备忘录角色类设计成发起人角色类的内部类。将Memento设计成Originator的内部类,从而将Memento对象封装在Originator里面;在外部提供一个标识接口MementoIF给CareTaker类以及其他对象,这样,Originator看到的是Memento的所有接口,而其他类看到的仅仅是标识接口MementoIF所暴露出的接口

还有一种更简便、更流行的方式,即"自述历史"模式备忘录,就是将Originator和CareTaker类合并到一起,发起人兼任备忘录的存取与取值操作

访问者模式

  访问者模式可以在不修改已有程序结构的前提下,通过添加额外的访问者来对已有代码的功能实现提升
  结构对象是访问者模式的必备条件
  访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于数据结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化
  数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过程叫双重分派。节点调用访问者,将自己传入,访问者则将某算法针对此节点执行
  此设计模式适用于增加访问者来拓展功能的情况,而不适用于增加节点

 

中介者模式

中介者模式用一个中介来封装一系列的对象交互,使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互

简单来说,就是将原来直接引用或者依赖的对象拆开,在中间加入一个中介对象,使得两头的对象分别与中介对象引用或者依赖

MVC模式也算是中介者模式在框架设计中的一个应用,控制层便是位于表现层和模型层之间的中介

 

解释器模式

 

解释器模式是一种按照规定的语法进行解析的方案。给定一个语言,定义它的文法的一种表示,并定一个解释器,该解释器使用该表示来解释语言中的句子

下面利用解释器模式来模拟布尔表达式的操作和求值

Java语言中,终结符是布尔变量true和false,非终结符表达式包含运算符and、or、和not,这个简单的文法如下:

Expression:Constant |Variable | Or | And | Not
And:Expression ‘And’Expression
Or:Expression ‘Or’Expression
Not:‘Not’Expression
Variable:任何标识符
Constant:’True’ | ’False’

posted @ 2021-02-26 11:58  Xiao旋  阅读(88)  评论(0编辑  收藏  举报