您的位置:首页 > 编程语言

设计模式之策略模式

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。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息