【设计模式】行为型模式

前言:

  创建型模式提供对象的创建,而隐藏对象间的逻辑方式,结构型关注类和对象的组合,组合接口和定义接口对对象进行组合,行为型模式对象间的具体通信,下面进行下行为型模式的总结;


1、商场促销-策略模式

a.定义:
  策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式算法的变化,不会影响到使用算法的用户
b.用途:
  适用于需要再不同时间应用不同的业务规则,也就是说在一个系统里有很多类,他们的区别只在于他们的行为不同
c.举例:
  商场里不同时间段不同程度的折扣方式,
d.优点:
  简化单元测试,每个算法都有自己的类,可以通过自己的接口单独测试,算法可以自由切换,避免使用多重条件判断,扩展性良好
e.缺点:
  策略类增多;
f.其他:策略模式与简单工厂模式结合---具体的实现职责也可以由Context承担,最大化的减轻了客户端的职责;

2、模板方法模式

a.定义:
  一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法是的子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤;
b. 理解:
  也就是说在模板方法中,把认为不变的算法封装在父类中,而把可变的部分通过继承的方式放在各个子类中实现;
d. 举例:
  西游记中的81难
e. 优点:
  封装不变部分,扩展可变部分;易维护,父类控制行为,子类实现;
f.缺点:
  每增加一个实现都需要增加相应的子类进行实现,增加系统的复杂性;
g.模式比较:
  工厂方法模式是模板模式的特殊应用,工厂方法是抽象一个父类方法,声明为抽象方法,然后这个抽象方法放在子类中实现,模板方法定义了多个抽象方法;

3、观察者模式

a. 定义:
   观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己;
b. 使用:
   当一个对象的改变需要同时改变其他对象的时候,当不知道具体有多少对象有待改变,也应该考虑使用观察者模式,双方都依赖抽象而不是依赖于具体;
c. 举例:
   举一个我们可能都有过得经历,自习课上说悄悄话聊天,总会同学是注意老师的到来,然后以某种默认的方式悄悄地告诉大家,这里的老师和负责掌握老师动态的某同学也就是抽象的通知者,而在说话,串位,玩手机的同学就是扮演观察者的角色
d. 优点:
   观察者和被观察者之间是抽象耦合的

4、状态模式

a. 定义:
  当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类;
b. 用途:
  用于条件判断过于复杂时,进行责任分解,也就是单一职责的体现和应用,把复杂的判断逻辑简化;当一个对象的行为取决于它的状态,且它在运行时根据状态改变它的行为时,就可以考虑了使用状态模式;
c. 举例:
  运动员们的发挥状态,正常发挥,非正常发挥,超长发挥,就是状态模式的生活化体现;
d. 优点:
  将所有与某一状态相关的行为放在一个类中,且便于增加新的状态;可以多个对象共享一个状态对象,减少系统中的对象个数;
e. 缺点:
  状态的使用增加系统对象和类的数量;状态模式对“开闭原则”的支持不太好,当需要增加新的状态时需要修改哪些负责状态转换的源代码,且需要修改该状态类对应的行为类的源代码;

5、备忘录模式

a. 定义:
  在不破坏封装的前体下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态;
b. 理解:
  把要保存的细节封装在备忘录(Memento)类中,当我们要进行保存细节的更改时不会影响客户端;
c. 用途:
  适用于功能比较复杂,但不需要维护或记录属性历史的类,或者需要保存的属性是众多属性中的一小部分,发起者可以根据保存的备忘录信息还原到前一状态;
d. 举例:
  Ctrl+Z 撤销功能就是备忘录模式的应用
e. 优点:
  恰当的保持了封装的边界,可以把复杂的对象内部信息对其他对象屏蔽;
f. 缺点:
  角色状态需要完整存储到备忘录对象中,当状态数据很大很多时,备忘录对象会非常耗用内存,造成自愿消耗和浪费;
g. 模式比较:
  如果系统中使用命令模式,需要事先命令撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态;

6、迭代器模式

a. 提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露该对象的内部表示
b. 用途:
  一个聚集对象,不考虑对象具体是什么都需要遍历,这时考虑使用迭代器模式;当需要对聚集对象有多种遍历方式时也可以考虑使用迭代器模式;为不同聚合结构提供统一接口;
d. 优点:迭代抽象,访问聚集对象的内容不暴露对象内部表示;对于一个聚合对象可以有多种遍历;

7、命令模式

a. 定义:
  将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,队请求排队或记录请求日志,以及支持可撤销的操作;
b. 用途:
  适用于要对行为进行“记录、撤销/重做、事务”等处理,将一组行为抽象为对象,实现二者松耦合;
c. 举例:
  我们放假信息宣布,调用者-接受者-命令
d. 优点:
  比较容易地设计一个命令队列;需要的情况下,较容易地将命令记入日志;允许接受请求的一方决定是否否决请求,容易实现请求的撤销和重做、易增加新的具体命令类;分离请求与执行操作对象;
e. 缺点:
  可能会导致系统有过多的具体命令,

8、职责链模式

a. 定义:
  使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止;
b. 用途:
  处理消息时过滤很多道手续或程序等问题;每个对象可以同时处理同一个请求,具体哪个对象处理该请求是不确定的,可根据请求和执行时刻选择确定;
c. 举例:
  我们的请假流程;
d. 优点:
  简化对象-客户提交一个请求并不知道哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任;增强了对象指派职责的灵活性;
e. 缺点:
  客户发出的请求极有可能到了链的末端得不到处理或者是因为没有正确配置而得不到处理;

9、中介者模式

a. 定义:
  用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式的相互引用,从而使其耦合松散,并且可以独立地改变他们之间的交互;
b. 应用:
  一般应用于一组对象以定义良好但复杂的方式进行通信的场合;想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合;
c. 举例:
  中介机构的存在

10、解释器模式

a. 定义:
  给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释起使用该表示解释语言中的句子;
b. 应用:
  某种特定类型的问题发生的频率足够高时,可以构建一个解释器

11、访问者模式

a. 定义:
  表示一个作用于某对象结构中的各元素的操作,它使你看可以在不改变各元素的类的前体下定义作用于这些元素的新操作;
b. 应用:
  适用于数据结构相对稳定的系统,又有易于变化的算法,把作用于结构上的操作之间耦合解开,也就是说把处理操作从数据结构中分离出来,使得操作集合可以相对自由的演化,实现
d. 优点:
  容易增加新的操作,增加新新操作也意味着增加一个新的访问者,
e. 缺点:
  增加新的数据结构变得困难;

小结:

  实践中对于设计模式的使用有一个更深刻的认识;

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值