java基础与进阶web攻城狮设计模式

设计模式—策略模式

2016-06-10  本文已影响258人  HJXANDHMR

本博客同步发表在http://hjxandhmr.github.io/2016/06/10/DesignPattern-Strategy/

今天我们来学习一种行为型模式,策略模式(Observer Pattern)。

模式定义

定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

模式结构

策略模式包含如下角色:

**Context: ** 环境类
**Strategy: ** 抽象策略类
**ConcreteStrategy: ** 具体策略类

UML图

代码实现

通常如果一个问题有多个解决方案或者稍有区别的操作时,最简单的方式就是利用if-else or switch-case方式来解决,对于简单的解决方案这样做无疑是比较简单、方便、快捷的,但是如果解决方案中包括大量的处理逻辑需要封装,或者处理方式变动较大的时候则就显得混乱、复杂,而策略模式则很好的解决了这样的问题,它将各种方案分离开来,让操作者根据具体的需求来动态的选择不同的策略方案。 这里以简单的计算操作(+、-、*、/)作为示例:

UML图

Strategy.java

/**
 * 计算操作的抽象
 */
public interface Strategy {
    double calc(double paramA, double paramB);
}

AddStrategy.java


/**
 * 加法的具体实现策略
 */
public class AddStrategy implements Strategy {

    @Override
    public double calc(double paramA, double paramB) {
        System.out.println("Execute AddStrategy");
        return paramA + paramB;
    }
}

SubStrategy.java

/**
 * 减法的具体实现策略
 */
public class SubStrategy implements Strategy {
    @Override
    public double calc(double paramA, double paramB) {
        System.out.println("Execute SubStrategy");
        return paramA - paramB;
    }
}

MultiStrategy.java


/**
 * 乘法的具体实现策略
 */
public class MultiStrategy implements Strategy {
    @Override
    public double calc(double paramA, double paramB) {
        System.out.println("Execute MultiStrategy");
        return paramA * paramB;
    }
}

DivStrategy.java


/**
 * 除法的具体实现策略
 */
public class DivStrategy implements Strategy {
    @Override
    public double calc(double paramA, double paramB) {
        System.out.println("Execute DivStrategy");
        if (paramB == 0) {
            throw new IllegalArgumentException("Cannot divide into 0");
        }
        return paramA / paramB;
    }
}

Calc.java


/**
 * 进行计算操作的上下文环境
 */
public class Calc {

    private Strategy mStrategy;

    public void setStrategy(Strategy strategy) {
        this.mStrategy = strategy;
    }

    public double calc(double paramA, double paramB) {
        if (mStrategy == null) {
            throw new IllegalStateException("You haven't set the strategy for computing.");
        }
        return mStrategy.calc(paramA, paramB);
    }
}

测试类

public class MyClass {

    public double calc(Strategy strategy, double paramA, double paramB) {
        Calc calc = new Calc();
        calc.setStrategy(strategy);
        return calc.calc(paramA, paramB);
    }

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        System.out.println("Calculation Add  " + myClass.calc(new AddStrategy(), 10, 5));
        System.out.println("Calculation Add  " + myClass.calc(new SubStrategy(), 10, 5));
        System.out.println("Calculation Add  " + myClass.calc(new MultiStrategy(), 10, 5));
        System.out.println("Calculation Add  " + myClass.calc(new DivStrategy(), 10, 5));
    }
}

运行结果

模式分析

策略模式的优点

策略模式的缺点

参考
http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html

上一篇 下一篇

猜你喜欢

热点阅读