设计模式之策略模式

Posted 曾淘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之策略模式相关的知识,希望对你有一定的参考价值。

概要

设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。

定义

策略模式定义了一系列的算法,并将每一个算法封装起来,他们之间还可以相互替换,策略模式独立于使用它的客户而独立变化

使用场景

1.同一类问题的多种处理方式
2.安全的封装多种同一类型的操作
3.同一抽象类有多个子类,需要if-else来选择具体的子类

UML

以上类图,非常简单,不用做过多解释,在使用设计模式演示例子之前,大家先看下下面这个demo

1.Tactics

抽象策略的接口,内部含有一个方法

2.ATactics

具体的A策略实现

案例分析

(1)动画案例

package com.zengtao.demo.tactics;

public class Animations 

    public static final int ALPHA = 1;
    public static final int TRANSLATION = 2;
    public static final int SCALE = 3;

    private void showAlpha() 
        System.out.println("view ----> 淡入动画");
    

    private void showTranslation() 
        System.out.println("view ----> 平移动画");
    

    private void showScale() 
        System.out.println("view ----> 缩放动画");

    

    public void show(int type) 
        if (type == ALPHA) 
            showAlpha();
         else if (type == TRANSLATION) 
            showTranslation();
         else if (type == SCALE) 
            showScale();
        
    


(2)调用

package com.zengtao.demo;

import com.zengtao.demo.tactics.Animations;

public class Main 

    public static void main(String[] str) 

        Animations animations = new Animations();
        animations.show(1);

        System.out.println();
        System.out.println("*****改变动画*****");
        System.out.println();

        animations.show(2);

    

(3)结果

大家看上面的demo,我实现的是一个view,添加动画的一个效果(伪代码),是不是非常简单,大家觉得上面的代码有问题么?很显然,上面的所有代码按照逻辑来讲,是没有问题的,一步一步执行下来,调理好像也很清晰,也能实现具体的效果,那么我来告诉大家,上面的代码其实是有很大的问题的,怎么说呢,你想,如果我需要添加一种动画,那我是不是要去修改这个类,要做什么修改呢?

1.添加一个int值,作为动画的类型
2.新增一个showXXX动画的方法
3.修改判断逻辑if-else

大家可能会想,看起来也很简单啊,也就这样改改而已,但是大家要知道以下几点:

1、如果后续再增加,在增加,卧槽了,怎么办呢,这个类越来越臃肿,越来越庞大,维护成本越来越高
2、我们在编码的时候,提倡的是新增,而不是修改以前的东西,这样很容易造成错误,非常不利于扩展,也属于硬编码行为
3、这其实是属于伪代码,如果实际情况,你还不得泪崩啊。。。

我们Java是面向对象的思想,怎么能这样做呢,那么如何解决?

很显然,答案:策略模式

代码演示

上面的类图我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

(1)抽象动画接口

package com.zengtao.demo.tactics;

public interface ITactics 

    String animation();


(2)具体动画

1.淡入动画

package com.zengtao.demo.tactics;

public class AlphaAnimation implements ITactics 

    @Override
    public String animation() 
        return "淡入动画";
    

2.缩放动画

package com.zengtao.demo.tactics;

public class ScaleAnimation implements ITactics 

    @Override
    public String animation() 
        return "缩放动画";
    

3.平移动画

package com.zengtao.demo.tactics;

public class TranslationAnimation implements ITactics 

    @Override
    public String animation() 
        return "平移动画";
    


(3)调用

package com.zengtao.demo;

import com.zengtao.demo.tactics.AlphaAnimation;
import com.zengtao.demo.tactics.Animation;
import com.zengtao.demo.tactics.TranslationAnimation;

public class Main 

    public static void main(String[] str) 

        Animation animation = new Animation();
        AlphaAnimation alphaAnimation = new AlphaAnimation();
        animation.setiTactics(alphaAnimation);
        animation.showAnimation();
        System.out.println();
        System.out.println("*****改变动画*****");
        System.out.println();
        TranslationAnimation translationAnimation = new TranslationAnimation();
        animation.setiTactics(translationAnimation);
        animation.showAnimation();

    

(4)结果

总结

看到了么,我们用策略模式,非常优雅的解决了我们之前的问题,如果我们要增加一个新的动画,那我们直接实现ITactics就好了,完全不用去修改其它的类,只需实现动画的具体实现方式就好了,既降低了维护成本同时又减少了出现错误的概率

现在是否有感觉设计模式其实非常爽,是不是,好了,以上就是策略模式的相关知识点了,当然如果你想要更加深入了解,请去阅读android 动画相关的源码,比如插值器等,或者其他Android 使用到的策略模式,ImageLoader的加载图片方式,在具体开发过程中,我们的策略模式其实还挺多的。

请尊重他人劳动成果,欢迎大家坐沙发的坐沙发,转载的转载,分享的分享,希望对大家有所帮助,tks。。。。。

以上是关于设计模式之策略模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之策略模式

38面向对象设计模式之策略模式(Strategy)

设计模式之策略模式

PHP设计模式之策略模式

设计模式——行为型模式之策略模式

设计模式之策略模式