安卓学习之策略模式
定义
原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
翻译过来:
策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
这样是可能有点泛,那我们先来说说使用场景吧:
假如目前我们有个交通工具,具体可为,船,车,地铁,具体行为都是可以运动,各自有自己的显示方法,按照面向对象编程,
创建基类交通工具,都可运动,显示有子类实现。
…..
abstract class Transport {
public void Run() {
LogUtils.wyjlog(“我是交通工具可以移动”);
}
public abstract void show();
}
…….
public class SubWay extends Transport {
@Override
public void show() {
LogUtils.wyjlog(“我是地铁”);
}
}
public class Boat extends Transport {
@Override
public void show() {
LogUtils.wyjlog(“我是船”);
}
}
public class XiaoCar extends Transport {
@Override
public void show() {
LogUtils.wyjlog(“我是小车”);
}
}
但此时突然有个需求是,陆地运输,此时你在父类Transport 中添加了
public void OnLandRun() {
LogUtils.wyjlog(“我可以陆地运输”);
}
发现在Boat中是不可以的,可以通过重写这个OnLandRun,然后什么也不做,
通过这个bug程序员也体会到了一件事:当涉及“维护”时,为了”复用(reuse)”目的而使用继承,并不太完美。
此时你想到以后还要添加其他的交通工具,使得其中有些特定的行为,一部分有一部分没有,这样会很难维护。
设计原则:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
针对接口编程,而不是针对实现编程。
将方法抽出来,独立存在,不在依赖对象。
例如将 Run这个行为抽出来,
interface RunBeHavior {
void run();
}
创建具体实现类了,
public class NormalRunBeHavior implements RunBeHavior{
@Override
public void run() {
LogUtils.wyjlog(“我是正常运动”);
}
}
public class UnNormalRunBeHavior implements RunBeHavior{
@Override
public void run() {
LogUtils.wyjlog(“我是非正常运动”);
}
}
重新构建基类
abstract class Transport {
private RunBeHavior mRunBeHavior;
public void setRunBeHavior(RunBeHavior runBeHavior) {
mRunBeHavior = runBeHavior;
}
public void performRun() {
// 委托给跑步行为类
mRunBeHavior.run();
}}
可已通过传入的对象去设置对应的run方法了。例如:
XiaoCar xiaoCar=new XiaoCar(); xiaoCar.setRunBeHavior(new NormalRunBeHavior()); xiaoCar.performRun();; Boat boat=new Boat(); boat.setRunBeHavior(new UnNormalRunBeHavior()); boat.performRun();
这就是策略模式了。