设计模式之策略模式
2016-09-07 15:20
169 查看
概要
设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义
策略模式定义了一系列的算法,并将每一个算法封装起来,他们之间还可以相互替换,策略模式独立于使用它的客户而独立变化使用场景
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。。。。。
相关文章推荐
- 设计模式之Strategy(策略)
- 设计模式之策略模式(strategy)--游戏角色使用武器
- [设计模式] 23.Strategy 策略模式
- [★] .NET 偶尔连接的设计策略 -联机状态- 脱机模式- 数据同步
- 设计模式袖珍版 连续转载之 - Strategy(策略)
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
- 设计模式随笔系列:鸭子-策略模式(Strategy)[原]
- 设计模式之Strategy(策略)
- 设计模式之策略模式探讨初步[引]
- 设计模式随笔系列:鸭子-策略模式(Strategy)[转]
- 设计模式之Strategy(策略)
- Java设计模式学习之一---策略模式
- AspectJ实现设计模式(二)——策略模式
- 设计模式之策略模式探讨初步
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式与泡mm的关系之strategy策略模式及再思考
- 设计模式之Strategy(策略)
- 设计模式随笔系列:鸭子-策略模式(Strategy)
- 设计模式(20)-策略模式(Strategy)