java设计模式总结篇--行为型模式(2)

行为型模式二组中总共包含6个模式
1. 解释器模式
2. 中介者模式
3. 访问者模式
4. 策略模式
5. 备忘录模式
6. 迭代器模式
解释器模式
给定一个语言 定义它的文法的一种表示 并定义一个解释器 这个解释器使用该表示来解释语言中的句子
如果一种特定类型的问题发生的频率足够高 那么可能就值得将该问题的各个实例表述为一个简单语言中的句子 这样就可以构建一个解释器 该解释器通过解释这些句子来解决该问题。
实战例子:音乐解释器 如果T则音高 如果C则…. 或者是正则表达式 浏览器等等
首先 建立一个抽象的解释器类 类中有解释的具体过程 比如说取出字符串的第一个字符 然后类中有一个抽象的执行类方法 Excute
然后 建立一个实现类继承自解释类 比方说是音符解释类
最后 客户端调用的时候 根据需要解释的字符串不同功能 进行switch判断 根据需要 new一个想要的解释类
这里需要注意的是 switch分支较多 可以使用简单工厂+反射来解决这个问题
适用场合
当有一个语言需要解释执行 并且你可将该语言中的句子表示成为一个抽象语法树时 可使用解释器模式
好处是
可以很容易地改变和扩展文法 因为该模式使用类来表示文法规则 你可使用继承来改变或者扩展该文法 另外解释器模式也比较容易实现文法 因为定义抽象语法树中各个节点的类的实现大体类似 这些类都易于直接编写
不足:
解释器模式为文法中的每一条规则至少定义了一个类 因此包含许多规则的文法可能难以管理和维护 建议当文法非常复杂时 使用其他的技术 如语法分析程序或者编译器生成器来处理
以上就是解释器模式的总结了
中介者模式 Mediator
用一个中介对象来封装一系列的对象交互 中介者使各对象不需要显式地相互引用 从而使其耦合松散 而且可以独立地改变它们之间的交互
实战例子:联合国调解
首先 建立一个抽象的联合国类 类中有一个抽象的声明方法 
然后 建立一个抽象的国家类
然后 建立一个具体的国家继承自抽象的国家 如美国 类中有个声明的方法和获取消息的方法 类中还有一个set联合国的方法 可以将联合国set进去
然后 建立一个具体的联合国继承自联合国类 类中添加几个具体的国家 并实现父类中的声明方法 进行一些国家间的操作
最后 客户端调用时 建立一个具体的联合国类 
然后 建立几个国家类 将联合国set进国家中
然后 将国家set进去联合国的集合中
然后 调用国家的具体方法来获得信息或者进行国家消息的传递 通过联合国来转发
适用场合
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合 以及想定制一个分布在多个类中的行为 而又不想生成太多的子类的场合
优缺点
中介者模式很容易在系统中应用 也很容易在系统中误用 当系统出现了多对多交互复杂的对象群时 不要急于使用中介者模式 而要先烦死你的系统在设计上是不是合理
中介者的出现减少了各个国家的耦合 使得可以独立的改变和复用各个国家类和中介者 由于把对象如何协作进行了抽象 将终结座位一个独立的概念并将其封装在一个对象中 这样关注的对象就从对象各自本身的行为转移到了他们之间的交互上来 也就是站在一个更宏观的角度去看待系统 由于实际中介者控制了集中化 于是就把交互复杂性都变为了中介者的复杂性 这就使得中介者会变得比任何一个国家都复杂
以上就是中介者模式的总结了
访问者模式 Visitor
表示一个作用于某处对象结构中的各元素的操作 它使你可以在不修改各元素的类的前提下定义作用于这些元素的新操作
实战例子:对男人和女人操作
首先 建立一个抽象的动作类 类中有抽象的男人的动作和女人的动作的方法(有几个具体的数据结构 就有几个抽象的方法)
然后 建立一个抽象的人的类 类中有accept方法 参数是动作
然后 建立具体的动作继承自抽象的动作类 类中重写了具体的动作发生时男人和女人的反应
然后 建立男人类和女人类继承自人类 类中的accept方法就是让传进来的参数(动作)取得动作类中的男人的方法 女人的就是取得女人的方法
然后 建立一个对象结构 其中有一个人的类的集合 这个对象结构中有attach方法和detach方法 还有一个display方法这个display有个形参就是动作类  display方法就是遍历这个集合 调用每个人的accept的方法 将display的形参传给accept  
最后 客户端调用的时候
首先 建立一个对象结构 
然后 attach男人和女人进去
然后 建立几个动作类 
然后 调用对象结构的display方法 将动作传递进去
适用场合
适用于数据结构相对稳定的系统 它把数据结构和作用于结构上的操作之间的耦合解脱开 使得操作集合可以相对自由地演化
访问者模式的目的就是要把处理从数据结构中分离出来 如果有比较稳定的数据结构 又有易于变化的算法的话 使用访问者模式就是比较合适的 因为访问者模式使得算法操作的增加变得容易
好处是
访问者模式的优点就是增加新的操作很容易 因为增加新的操作就意味着增加一个新的访问者 访问者模式将有关的行为集中到一个访问者对象中
缺点是
使增加新的数据结构变得困难了
以上就是访问者模式的总结了
策略模式
定义了算法家族 分别封装起来 让它们之间可以互相替换 此模式让算法的变化 不会影响到使用算法的客户
实战例子:商场促销活动
首先 建立一个抽象的策略算法类 类中有一个抽象打折的方法
然后 建立几个具体的策略继承自抽象的策略类并实现各自的算法
然后 建立一个Context类 类中有一个策略对象 在构造函数里将策略类传进来并赋值给this 在这个类中还有一个调用策略的打折函数的方法
最后 在客户端调用时 直接建立一个Context对象 初始化时传进来一个new的策略
然后 调用Context中的那个方法就可以了
好处是
策略模式是一种定义一些列算法的方法 从概念上来看 所有这些算法完成的都是相同的工作 只是实现不同 它可以以相同的方式调用所有的算法 减少了各种算法类与使用算法类之间的耦合
策略模式的策略类层次为Context定义了一些列的可供重用的算法或行为 继承有助于析取出这些算法中的公共功能
策略模式的优点是简化了单元测试 因为每个算法都有自己的类 可以通过自己的接口单独测试
当不同的行为堆砌在一个类中时 就很难避免使用条件语句来选择合适的行为 将这些行为封装在一个个独立的策略类中可以在使用这些行为的类中消除条件语句
策略模式就是用来封装算法的 但在实践中 我们发现可以用它来封装几乎任何类型的规则 只要在分析过程中听到需要在不同时间应用不同的业务 就可以考虑使用策略模式处理这种变化的可能性 在基本的策略模式中 选择所用具体实现的职责由客户端对象承担 并转给策略模式的Context对象
以上就是策略模式的总结了
备忘录模式 Memento
在不破坏封装性的前提下 捕获一个对象的内部状态 并在该对象之外保存这个状态 这样以后就可将该对象恢复到原先保存的状态
实战例子:游戏进度保存
首先 建立一个发起人的类 类中有状态 有返回Memento的Create方法 有setMemento的方法 Memento是形参传入 set方法中将传入的Memento的状态 都set给发起人
然后 建立一个Memento备忘录的类 初始化的时候将状态传入
然后 建立一个管理者类类中有一个Memento对象 和set\get方法
最后 客户端调用时
首先 发起人 o =new 发起人()建立一个发起人对象 然后设置这个对象的状态
然后 管理者c=new 管理者() c.Memento=o.CreateMemento建立一个管理者对象 设置对象的Memento
然后 需要还原的时候 o.setMemento(c.Memento)就还原了
好处是
把要保存的细节给封装在了Memento中了 哪一天要更改保存的细节也不用影响客户端了 
适用场合
备忘录模式比较适用于功能比较复杂的 但是需要维护或者记录属性历史的类 或者需要保存的属性只是众多属性中的一小部分时 发起人可以根据保存的备忘录信息还原到前一状态
如果在某个系统中使用命令模式时 需要实现命令的撤销功能 那么命令模式可以使用备忘录模式来存储可撤销操作的状态 使用备忘录可以吧复杂的对象内部信息对其他的对象屏蔽起来
当角色的状态改变的时候 有可能这个状态无效 这个时候就可以使用暂时存储起来的备忘录将状态复原
以上就是备忘录模式的总结了
迭代器模式 Iterator
提供一种方法顺序访问一个聚合对象中各个元素 而又不暴露该对象的内部表示
实战例子:Iterator
首先 建立一个迭代器抽象类 类中有返回object的First、Next、CurrentItem抽象方法和返回bool的IsDone抽象方法
然后 建立一个聚集抽象类 类中有个返回迭代器抽象类的CreateIterator方法
然后 建立一个具体的迭代器类继承自抽象的迭代器类 初始化时将具体的聚集对象传入 并完善4个方法
然后 建立一个具体的聚集类继承自抽象的聚集类 类中有一个object的集合 有一个返回数量和当前对象的方法
最后 客户端调用时
首先 建立一个聚集对象
然后 建立一个迭代器并初始化 将聚集对象作为形参传入
然后 建立一个object等于迭代器的First返回值
然后 while循环遍历
适用场合
当你需要访问一个聚集对象 而且不管这些对象是什么都需要遍历的时候 你就应该考虑使用迭代器模式
你需要对聚集有多种方式遍历时 可以考虑使用迭代器模式
为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口
以上就是迭代器模式的总结了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值