设计模式之策略模式
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。。。。。
以上是关于设计模式之策略模式的主要内容,如果未能解决你的问题,请参考以下文章