设计模式之策略模式

概要

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

定义

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

使用场景

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。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值