Android 策略模式
2016-06-06 22:27
447 查看
策略模式是一种针对算法的一个设计模式,将不同的算法封装在起来,并让它们可以相互替换。
如果我们在开发的时候,实现某个功能有多种算法的时候,我们应该根据实际情况去选择不同的算法来完成这项功能,比如,在听音乐的时候,定时退出的功能,有的通过时间倒计时归0退出程序,而有的是通过歌曲的数目,当听完多少首歌曲的时候自动退出程序,这个时候,在实现退出功能的时候,我们需要根据用户的选择来判断需要使用何种的算法。而策略模式正是实现这项功能的更好的设计模式,将算法独立于客户端,这样的话,让算法的变化独立于客户端的变化。
Client: 客户端类
Strategy: 策略的抽象类
ConcreteStrategyA: 具体的策略实现类A,算法A
ConcreteStrategyB: 具体的策略实现类B, 算法B
- Client :某个方法有不同计算方式的客户端类
- ControllerExit:检查能否退出的抽象类
- TimeControllerExit: 根据时间去检查能否退出的具体类
- CountControllerExit:根据次数去检查能否退出的具体类
CountControllerExit
TimeControllerExit
Client
运行的log图:
缺点:类回增多,另外有具体的策略去实施时,客户端必须要明确知道是何种策略。并通过依赖注入的方式告诉给客户端。
如果我们在开发的时候,实现某个功能有多种算法的时候,我们应该根据实际情况去选择不同的算法来完成这项功能,比如,在听音乐的时候,定时退出的功能,有的通过时间倒计时归0退出程序,而有的是通过歌曲的数目,当听完多少首歌曲的时候自动退出程序,这个时候,在实现退出功能的时候,我们需要根据用户的选择来判断需要使用何种的算法。而策略模式正是实现这项功能的更好的设计模式,将算法独立于客户端,这样的话,让算法的变化独立于客户端的变化。
策略模式的介绍
策略模式的uml
Client: 客户端类
Strategy: 策略的抽象类
ConcreteStrategyA: 具体的策略实现类A,算法A
ConcreteStrategyB: 具体的策略实现类B, 算法B
举个栗子
需求:我们需要实现一个控制退出的程序,业务的需求已开始只是通过时间去控制退出的时间,但是后来又加了一种通过使用次数的退出的机制。这个时候我们会发现一个退出判断的操作,是有两种不同形式的生成方式。即一个操作是有不同两种算法的时候,这个时候使用strategy模式就较为合适了。栗子的策略模式的uml图
栗子的策略模式的package图
- Client :某个方法有不同计算方式的客户端类
- ControllerExit:检查能否退出的抽象类
- TimeControllerExit: 根据时间去检查能否退出的具体类
- CountControllerExit:根据次数去检查能否退出的具体类
具体的代码
ControllerExitpublic abstract class ControllerExit { public abstract boolean remain(long initTime,int count); }
CountControllerExit
public class CountControllerExit extends ControllerExit { @Override public boolean remain(long initTime, int count) { if(--count > 0){ return false; } return true; } }
TimeControllerExit
public class TimeControllerExit extends ControllerExit{ @Override public boolean remain(long initTime,int count){ if(System.currentTimeMillis()-initTime > 200 ){ return true; } return false; } }
Client
public class Client { private ControllerExit exit; public static void main(String[] args) { Client client = new Client(); client.setControllerExit(new TimeControllerExit()); boolean isRemain = client.checkRemain(System.currentTimeMillis(), 0); System.out.println("是否退出:"+isRemain); client.setControllerExit(new CountControllerExit()); isRemain = client.checkRemain(System.currentTimeMillis(), 1); System.out.println("是否退出:"+isRemain); } public void setControllerExit(ControllerExit exit){ this.exit = exit; } public boolean checkRemain(long initTime,int count){ return exit.remain(initTime, count); } }
运行的log图:
策略模式优缺点
优点:把具体的算法独立出来,做到算法的类和调用的类的分离。并且无论是在扩展还是修改方面都带来很好的方便,缺点:类回增多,另外有具体的策略去实施时,客户端必须要明确知道是何种策略。并通过依赖注入的方式告诉给客户端。
总结
策略模式是一种将算法独立出客户端的模式,实现将相同的行为的有不同的具体实现策略。简言之就是将算法分离。从而达到更好的扩展性。相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories