(四)策略模式&状态模式&责任链模式

匿名 (未验证) 提交于 2019-12-02 23:56:01

策略模式

1、策略模式介绍

实现某一个功能可以有多种算法或者策略,我们根据实际情况选择不同的算法或者策略完成该功能,一般就会用if…else或者switch…case语句来选择具体算法,需要增加一种新的排序算法时,需要修改封装算法类的源代码,违背了ocp原则和单一职责原则,将这些算法抽象出来提供一个统一的接口,不同算法有不同的实现类,让算法独立于使用它的客户而独立

2、策略模式的使用场景

(1)针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
(2)需要安全地封装多种同一类型的操作时
(3)出现同一个抽象类有多个子类,又需要if…else switch-case选择具体子类时

3、策略模式的简单实现

建立一个策略的抽象,让具体的策略实现实现这个接口,Context则可以充当操作策略的上下文环境
一下例子为价格计算策略,它们都实现了calculatePrice这个接口的方法
以下代码为扮演Context角色的类

public class TranficCalculator{ 	public static void main(String[] args){ 	TranficCalculator calculator =      new TranficCalculator() 	calculator.setStrategy(new BusStrategy(); 	} 	CalculateStrategy mStrategy; 	public void setStrategy(CalculateStrategy m){ 	this.mStrategy = m; 	} 	public int calculatePrice(int km){ 	return mStrategy.calculatePrice(km) 	} }
4、Android源码中策略模式实现

(1)时间插值器,作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统有三种插值器,分别为线性插值器、加速减速插值器,为策略模式典型应用,插值器通过实现接口Interpolator从而通过setAnimation来加入到动画效果
(2)属性动画中Animator,通过设置不同的Animator来实现不同的效果

5、策略模式的优缺点

(1)优点:结构清晰明了、使用简单直观
耦和度相对较低,拓展方便
操作封装更为彻底,数据更为安全
(2)缺点:随着策略增加,子类也会变得繁多

״̬ģʽ

1、状态模式介绍

状态模式中的行为是由状态来决定的,不同状态下有不同的行为,状态模式和策略结构基本一样,目的本质不同,策略模式的行为是可以相互替代,而策略模式中状态改变,行为也随之改变,比如灯的开关两种状态

2、状态模式的使用场景

(1)一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为
(2)代码中有大量与状态有关的条件语句

3、状态模式的简单实现

于上文策略模式相同,但是状态和策略的本质和目的有所不同
应用方面: 联想到微博的转发与评论功能,需要登陆才可以进行转发评论,本质也是两种状态:登录状态和注销状态

4、状态模式的优点和缺点

(1) 优点:将所有与一个特定状态相关的行为都放入一个状态对象中,它提供了一个更好方法来组织与特定状态相关代码
(2)缺点:缺点还是使用避免不了系统类和对象的个数

责任链模式

1、责任链模式介绍

可以类比于链表,将每一个对象看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,依次传递给每一个节点对象,直至有对象处理这个请求为止,感觉可以参考链表的定义,就好像链表的遍历

2、责任链模式的使用场景

多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定
在请求处理者不确定的情况下向多个对象中的一个提交一个请求
需要动态指定一组对象处理请求

3、责任链模式的简单实现

用两个角色来实现简化版的通用代码
一个为抽象处理者角色,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用,相当于链表
一个为具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象
可以定义一个级别令什么级别的处理逻辑就对应什么样的请求级别
对于责任链中的一个处理者对象,其只有两个行为,一是处理请求,二是将请求传送给下一个节点,不允许某个处理器对象在处理了请求后又将请求传送给上一个节点的情况,就是单向传递,只有两个方向就是处理和传送,所有对象均未处理称为不纯的责任链

4、Andriod源码中的责任链模式实现

(1)当用户接触屏幕时,Android都会将对应的事件包装成一个事件对象从ViewTree的顶部至上而下地分发传递
(2)Andriod中的有序广播,通过它可以轻松地实现一种全局的责任链事件处理,通过getResultExtra和setResultExtra中的Bundle进行信息的传递

5、责任链模式的优点缺点

(1)优点:请求者和处理者关系的解耦,提高代码的灵活性
(2)缺点:处理者太多那么遍历必定会影响性能,特别是递归调用中

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!