导引
- 例子1
最近当当打折(当当天天打折=_=),漫画书7折,小说9折,计算机专业书每本少1元。肿么计算?!?
- 例子2
当当要去海南岛旅行,现在他有几种去的方式,1:游过去(免费!),2:坐船(只要998!),3:坐飞机(1314~)。肿么选择?
以上两个例子,第一个,不管你使用什么方式计算价格,结果就是反正赚钱;第二个,不管你以什么方式去对岸,结果就是你过去了(第一种方式可能过不去……)。
但不管怎么选,这都是达到目的的一种方式方法。
所以,要讲一讲策略模式了!
什么是策略模式?
对象的行为模式
针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使它们能够相互替换。
策略模式使得算法可以再不影响客户端的情况下发生变化。
定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
UML
角色
- 环境角色(Context):持有一个Strategy对象的引用,维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
/**
* 环境类
*/
public class Context {
private Strategy strategy;
public void strategyInterface() {
strategy.strategyInterface();
}
}
- 抽象策略角色:通常由一个接口和抽象类实现,定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
/**
* 抽象策略类
*/
abstract class Strategy {
public abstract void strategyInterface();
}
- 具体策略角色:包装了相关的算法。
/**
* 具体策略类
*/
public class ConcreteStrategy extends Strategy {
@Override
public void strategyInterface() {
System.out.println("ConcreteStrategy");
}
}
优缺点
优点
策略模式提供了管理相关算法族的办法,恰当的使用继承可以把公共的代码移到父类里面,从而避免重复的代码。
策略模式提供了可以替换继承关系的办法。
使用策略模式可以避免使用多重条件转移语句。
缺点
客户端必须知道所有的策略类,并自行决定使用哪一个策略类。意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。所以,策略模式只适用于客户端知道所有的算法或行为的情况。
策略模式造成很多的策略类。
Some things are very important.
策略模式只封装算法。策略模式只封装算法。策略模式只封装算法。
所以客户端得知道所有策略类,也就是所有的选择,什么时候使用由客户端决定。
它所遵循的设计原则:开闭原则!里氏替换原则!
在Android中的使用
- 动画
2.TabHost
3.Volley
……
在Android应用很广泛,就不一一列举,大伙儿自己发现去吧。
T_T