Android常用的设计模式<三>:策略模式

Strategy

前两篇文章分别介绍了Builder模式Observer模式,本文将介绍另一种Android里面经常用到的设计模式,策略模式。

策略模式是一种通俗易懂的设计模式,常用于组织一些可替换的算法组件,这些算法组件本质上完成同一个性质的任务,可以互相替换,只是实现细节上存在些许差异。

举个例子,为了完成射击敌人的任务,我们可以采取不同的武器进行,手枪,步枪,或者火炮。这里不同的武器就是不同的策略,这些策略可以互相替换,并且都可以实现射击敌人的任务,区别在于执行过程的差异。

利用策略模式,我们可以采用如下的代码实现。

首先抽象出不同射击策略共同的接口:
ShootInterface.java

public interface ShootInterface {
    void shoot();
}

该接口包含了射击接口,不同武器实现不同的射击函数。

手枪射击:
PistolStrategy.java

public class PistolStrategy implements ShootInterface{
    @Override
    public void shoot() {
        System.out.println("Pistol shooting, kills 1 enemy every 10 shots.");
    }
}

步枪射击:
RifleStrategy.java

public class RifleStrategy implements ShootInterface{
    @Override
    public void shoot() {
        System.out.println("Rifle shooting, one shot, one kill.");
    }
}

火炮射击:
CannonStrategy.java

public class CannonStrategy implements ShootInterface {
    @Override
    public void shoot() {
        System.out.println("Cannon shooting, one shot, kills a lot.");
    }
}

新建一个消灭敌人的任务类:
EliminateEneryTask.java

public class EliminateEneryTask {
    private ShootInterface shootStrategy;
    
    public void setShootStrategy(ShootInterface strategy) {
        shootStrategy = strategy;
    }
    
    public void action() {
        shootStrategy.shoot();
    }
}

这个类的setShootStrategy函数用于外部调用来设置具体的设计策略,action方法实施该策略下的射击动作。

调用如下:

public class StrategyPatternDemo {
    public static void main(String[] args) {
        PistolStrategy pistol = new PistolStrategy();
        RifleStrategy rifle = new RifleStrategy();
        CannonStrategy cannon = new CannonStrategy();
        
        EliminateEneryTask task = new EliminateEneryTask();
        
        task.setShootStrategy(pistol);
        task.action();
        
        task.setShootStrategy(rifle);
        task.action();
        
        task.setShootStrategy(cannon);
        task.action();
    }
}

这种模式下,我们新添加一种射击策略也很简单,只需要新加一个实现了ShootInterface接口的类,并实现shoot方法即可,无需修改EliminateEneryTask类。同样的需求如果不使用策略模式,我们可能需要在EliminateEneryTask里面设置一系列的if/else进行策略的判断,显然不如这种方式优雅。

在Android属性动画中,ValueAnimator类的插值器(Interpolator)就使用了策略模式:

ValueAnimator animator = ValueAnimator.ofInt(0,600);

animator.setDuration(1000);
animator.setInterpolator(new LinearInterpolator());

animator.start();

通过ValueAnimator的setInterpolator函数,可以设置不同的插值器,也就是不同的插值策略,比如线性插值器LinearInterpolator,加速度插值器AccelerateInterpolator,减速度插值器DecelerateInterpolator等。它们都实现了TimeInterpolator接口,完成各自的插值计算,并提供统一的对外调用函数:

public interface TimeInterpolator {
    float getInterpolation(float input);
}

这样就可以通过setInterpolator设置任意的插值策略,包括自己实现的策略。

像策略这种设计模式,本身并没有什么高深的地方,只要了解过一次,就能简单的套用在日常编程中,运用得当的话,能显著提高代码质量,是一种低成本,高收益的设计模式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容