行为型模式一组中总共包含5个模式
1. 观察者模式
2. 模板方法模式
3. 命令模式
4. 状态模式
5. 职责链模式
观察者模式
定义了一种一对多的依赖关系让多个观察者对象同时监听某一个主题对象这个主题对象在状态发生变化时会通知所有观察者对象使他们能够自动更新自己
实战例子:老板回来了秘书通知大家关掉网页
首先建立一个抽象的通知者类类中有一个观察者的集合然后定义一个添加和删除观察者的方法最后是一个循环观察者集合进行唤醒的方法
然后建立一个抽象的观察者类类中有一个抽象的更新自己的接口
然后建立一个具体的通知者继承自抽象的通知者
然后建立一些具体的观察者继承自抽象的观察者类中用一个形参将通知者传送进来然后实现了父类中的更新自己的接口
最后客户端调用的时候
首先建立一个具体的通知者然后用通知者添加几个新的观察者进去
然后改变通知者的状态调用通知者中的循环遍历的方法让观察者更新自己的状态
观察者模式的特点
将一个系统分割成一系列相互协作的类有一个很不好的副作用那就是需要维护相关对象间的一致性我们不希望为了维持一致性而使各类紧密耦合这样会给维护 扩展和重用都带来不便
当一个对象的改变需要同时改变其他对象而且它不知道具体有多少对象有待改变时应该考虑使用观察者模式
一个抽象模型有两个方面其中一方面依赖于另一方面这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用
观察者模式所做的工作其实就是在解除耦合让耦合的双方都依赖于抽象而不是依赖于具体从而使得各自的变化都不会影响另一边的变化
但是这个例子中有一个问题就是抽象通知者中 有抽象观察者 耦合还是没有彻底的解除 所以这个地方可能会使用委托 具体参考委托
以上就是观察者模式的总结了
模板方法模式
定义一个操作中的算法的骨架而将一些步骤延迟到子类中模板方法使得子类可以不改变一个算法的结构即可冲定义该算法的某些特定步骤
实战例子:两个学生回答同一份卷子选择题的
首先建立一个抽象模板类类中创建几个抽象的方法并且在类中建立一个调用这些抽象方法的方法
然后建立几个具体类继承自抽象模板类根据不同的需求 在类中实现那几个抽象的方法
最后客户端调用时
先建立一个抽象模板类让这个类等于新的具体实现类然后调用类中的模板方法
模板方法模式是通过把不变的行为搬移到超类去除子类中的重复代码来体现它的优势
模板方法模式就是提供了一个很好的代码复用平台当不变的和可变的行为在方法的子类实现中混合在一起的时候不变的行为就会在子类中重复出现通过模板方法模式把这些行为搬移到单一的地方这样就帮助子类摆脱重复的不变行为的纠缠
既然用了继承并且肯定这个继承有意义就应该要成为子类的模板所有重复的代码都应该要上升到父类去而不是让每个子类都去重复当我们要完成在某一细节层次一致的一个过程或者一系列步骤但其个别步骤在更详细的层次上的实现可能不同时我们通常考虑用模板方法模式来处理
以上就是模板方法模式的总结了
命令模式
将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化对请求排队或者记录请求日志以及支持可撤销的操作
实战例子:暂无
首先建立一个抽象的command类类中有一个接收者和一个抽象的实现方法
然后建立一个具体的command类继承自抽象的在类中实现那个抽象的方法
然后建立一个invoker类这个类负责让command执行其里边实现方法类中有调用command中的方法的行为和setcommand方法
然后建立一个接收者类
最后客户端调用时
首先建立一个接收者
然后建立一个新的命令然后将接收者当做形参传进去
然后建立一个invoker 将command set进invoker中
最后调用invoker的调用command中方法的行为
好处是
第一它能较容易地设计一个命令队列
第二在需要的情况下 可以较容易地将命令存入日志
第三允许接收请求的一方决定是否要否决请求
第四可以容易地实现对请求的撤销和重做
第五由于加进新的具体命令类不影响其他的类因此增加新的具体命令类很容易
最关键的好处还是命令模式把请求一个操作的对象与指导怎么执行一个操作的对象分隔开
敏捷开发原则告诉我们不要为代码添加基于猜测的实际不需要的功能如果不清楚一个系统是否需呀命令模式一般就不要着急去实现它事实上 在需要的时候通过重构实现这个模式并不困难 只有在真正需要如撤销或者恢复操作等功能时 把原来的代码重构为命令模式才有意义
以上就是命令模式的总结了
状态模式
当一个对象的内在状态改变时允许改变其行为这个对象看起来像是改变了其类
实战例子:不同时间点上工作的状态不同
首先建立一个抽象的状态类里边一个Handler处理方法
然后建立几个具体
适用场所
当一个对象的行为取决于它的状态并且它必须在运行时刻根据状态改变它的行为时就可以考虑使用状态模式了
好处是
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况把状态的判断逻辑转移到表示不同状态的一系列类当中可以把复杂的判断逻辑简化
将特定的状态相关的行为都放入一个对象中由于所有与状态相关的代码都存在于某个具体状态类中所以通过定义新的子类可以很容易地增加新的转台和转换
状态模式通过把各种状态转移逻辑分布到具体的状态的子类之间来减少相互间的依赖
以上就是状态模式的总结了
职责链模式
使多个对象都有机会处理请求从而避免请求的发送者和接收者之间的耦合关系将这个对象连成一条链并沿着这条链传递该请求直到有一个对象处理它为止
实战例子:加薪审批
首先建立一个抽象的Handler处理类类中有一个peotected Handler xxx;然后还有一个抽象的处理request的方法和一个setHandler的方法
然后建立几个具体的Handler类继承自抽象的Handler 里边实现处理request的方法实现的时候 是这样 首先判断传进来的request是不是自己能处理的 如果能处理 那么处理 如果不能处理 调用自己的那个 peotectedHandler xxx 的xxx的处理request事件
最后客户端调用时
建立几个Handler
Handler1.setHandler(Handler2)
Handler2.setHandler(Handler3)
然后对request集合进行遍历让Handler1.处理reques;
好处是
当客户提交一个请求时请求是沿链传递直至有一个具体Handler对象负责处理它这就使得接收者和发送者都没有对方的明确信息而且链中的对象自己也并不知道链的结构结果是职责链可简化对象的相互连接他们仅需保持一个指向其后继者的引用而不需保持它所有的候选接受者的引用可以随时地增加或者修改处理一个请求的结构增强了给对象指派职责的灵活性
要当心的是一个请求极有可能到了链的末端都得不到处理或者因为没有正确配置而得不到处理要事先考虑周全
以上就是职责链模式的总结了