欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

安卓学习之策略模式

程序员文章站 2022-09-28 15:40:16
定义 原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes...

定义

原文: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();

这就是策略模式了。