ViewPage 大圣归来 原生示例
Markdown版本笔记 | 我的GitHub首页 | 我的博客 | 我的微信 | 我的邮箱 |
---|---|---|---|---|
MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目录
策略模式
简介
策略模式定义了一系列算法
,并将每一个算法封装起来,而且使它们可以相互替换
。策略模式让算法独立于使用它的客户端而独立变化
使用这个模式来将一组算法
封装成一系列对象,通过传递这些对象可以灵活的改变程序的功能。
使用场景
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
- 需要安全地封装多种同一类型的操作时
- 出现同一抽象类有多个子类,而又需要通过
if-else
或者switch-case
来选择具体的子类时
使用例子:
Android中属性动画的时间差值器
分为线性差值器、加速减速差值器等,这些差值器里面就用到了策略模式来隔离不同的动画速率计算算法。
在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法
或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如查找、排序等。
一种常用的方法是硬编码,在一个类中如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else
或者switch
等条件判断语句来进行选择。
这两种实现方法我们都可以称之为硬编码,如果需要增加
一种新的查找算法,需要修改封装算法类的源代码。更换查找算法,也需要修改客户端调用代码。
在这个算法类中封装了大量查找算法,该类代码较复杂,维护较为困难。
如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
模式的组成
- 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
- 抽象策略类(Strategy):定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
- 具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。
总结
- 策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。
- 策略模式很好地展示了开闭原则,也就是定义抽象,注入不同的实现,从而达到很好的扩展性
- 当我们在实现一个功能时遇到很多if-else或是switch-case的时候就可以考虑下这里是不是可以用策略模式了
案例
下面我们以计算不同交通工具的车费来简单看看策略模式的实现
首先抽象出计算车费的操作,因为不同的策略最后都会计算车费并返回结果
public interface CalculateStragety {
int calculatePrice(int km); //根据公里数计算价格
}
然后我们分别实现具体的策略,比如计算公交车的车费的策略
public class BusStragety implements CalculateStragety {
@Override
public int calculatePrice(int km) {
return 2; //省略具体的算法
}
}
再加一个出租车的车费计算策略
public class TaxiStragety implements CalculateStragety {
@Override
public int calculatePrice(int km) {
return 10 + km * 2; //省略具体的算法
}
}
然后我们看看怎么根据需要注入不同的策略,并把具体的计算委托给注入的策略
public class TrafficCalculator {
private CalculateStragety mCalculateStragety;
public void setCalculateStragety(CalculateStragety calculateStragety) {
mCalculateStragety = calculateStragety; //根据需要注入相应的策略
}
public int calculatePrice(int km) {
return mCalculateStragety.calculatePrice(km); //把具体的计算委托给注入的策略
}
}
测试
class Test {
public static void main(String[] args) {
TrafficCalculator trafficCalculator = new TrafficCalculator();
trafficCalculator.setCalculateStragety(new BusStragety());
trafficCalculator.calculatePrice(66);
}
}
在上面的例子中我们通过在TrafficCalculator中动态注入计算公交车车费的策略来计算公交车费,当然我们也可以计算出租车费,只需要把注入的策略改为出租车车费计算策略就可以了。
2016-04-21
ViewPage 大圣归来 原生示例的更多相关文章
- ButterKnife 8.2.1 大圣归来
零.前言 ButterKnife是一个视图注入的框架,主要帮我们解决无脑的findViewById.设置监听事件等等体力劳动. 一.引入 好消息是ButterKnife终于使用apt生成代码了,首先在 ...
- 大圣画廊v0.2(2015.7.17)
0.2版本号加入的功能 以tag分类图片 美化.添加瀑布流效果 添加tag页和单张图片页 添加公布图片页 以下是具体解释. 每添加一个功能,都要从模型.模板,视图,路由四个方面一一改动. 模型:添加t ...
- Java类初始化顺序,大神3个示例带你躺坑。。
最近发现微信群里面有些群友在讨论类的初始化顺序,如类的静态变量.成员变量.静态代码块.非静态代码块.构造器,及继承父类时,它们的初始化顺序都是怎样的,下面我通过例子来说明这个情况,以免被人误导. 示例 ...
- JS原生示例 案例 学习
写在前面 原生JS是原理,框架是迎合业务需求的重要关键工具 本文是整理工作及学习中理解的基础和难点,便于多方位理解功能模块整合和使用 不定期更新 行文仓促,文中有错误在所难免,欢迎诸位指正 trans ...
- 5大最新云原生镜像构建工具全解析,3个来自Google,你了解几个?
1云原生大背景下的镜像构建在分享开始,我想先跟大家简单聊一下云原生,可能不会详细展开,而是带领大家了解一下云原生对镜像构建方面的影响.第一,在接触云原生相关的技术时,无论是要解决开发.测试环境的问题, ...
- Poco::JSON::Array 中object 设置preserveInsertionOrder 时,stringify出错-->深入解析
在使用poco version 1.6.0时 Poco::JSON::Array 在object 设置preserveInsertionOrder =true 时 调用 array.stringif ...
- R语言——七月
这两个月没有写什么代码.也没做什么大项目,基本就是对以前写的那个用ggplot2可视化数据的项目做一些增增补补,大部分技术难关都在ggplot2和R语言EXCEL处理这里解决并总结了.然后业余帮人修改 ...
- poco json 中文字符,抛异常JSON Exception -->iconv 转换 备忘录。
起因 最近linux服务器通信需要用到json. jsoncpp比较出名,但poco 1.5版本以后已经带有json库,所以决定使用poco::json(linux 上已经用到了poco这一套框架). ...
- 让复杂Json数据和对象自由转换 --- Gson
Gson是谷歌用于对Json操作的库,里面有着强大而又方便的功能,最常用的就是 fromJson():将json数据转化为对象: toJson():将对象转化为json数据! 对于普通的json数据使 ...
随机推荐
- 实现跨线程访问UI控件的3种方法
namespace 多线程 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } privat ...
- sizeof(int *) 和 sizeof(int)型的大小问题
小问题,暂时记录注意一下 printf("sizeof(int): %d\n", (int)sizeof(int)); printf("sizeof(int ...
- JS小技巧大本事(持续更新)
1. 复制N个字符 String.prototype.repeat = function(num){ return (new Array(++num)).join(this); } var a = ' ...
- C#程序中将图片转换为byte数组,并将byte数组转换为图片
/// <summary> /// 将图片以二进制流 /// </summary> /// <param name="path"></pa ...
- Python中函数参数传递问题
先上两个例子: http://python.jobbole.com/85231/ a = 1 def fun(a): a = 2 fun(a) print a # 结果为1 fun(a)中的a,可以看 ...
- xcode导出ipa的几种方式-by
1,编译: Product -> Archive 2,导出: Window -> Organizer (Command + Shift +2) -> Archives ->Di ...
- 转:PHP include()和require()方法的区别
文章来自于:http://developer.51cto.com/art/200909/153687.htm 本文总结了PHP的include()和require()两种包含外部文件的方法的不同之处. ...
- ubuntu后台运行命令行
ubuntu 程序后台运行几个方法 . 程序后加上“&” ,即 “./myjob &”, 将命令放入到一个作业队列中,可以用命令“jobs” 查看 . 将1中的命令放在 “()”中, ...
- 转载:关于 Token,你应该知道的十件事
关于 Token,你应该知道的十件事 原文地址:http://alvinzhu.me/blog/2014/08/26/10-things-you-should-know-about-tokens/ 原 ...
- cf C. Hamburgers
http://codeforces.com/contest/371/problem/C 二分枚举最大汉堡包数量就可以. #include <cstdio> #include <cst ...