策略模式-Java设计模式(二)

192 阅读2分钟

** 2019-12-02 14:08:17 **

策略模式-Java设计模式(二)

策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。(超市打折...)

适用范围

1.在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。 2.一个系统有许多许多类,而区分它们的只是他们直接的行为。

优缺点

优点: 1.算法可以自由切换。 2.避免使用多重条件判断。 3.扩展性良好。

缺点: 1.策略类会增多。 2.所有策略类都需要对外暴露。

关键代码

实现同一个接口。



代码 & 结构图

【商场商品打折、涨价、降价】例子

/**
 * 公共算法接口
 */
public interface Strategy {
    public double doOperation(double num1, double num2);
}
/**
 * 涨价
 */
public class OperationAdd implements Strategy {
    /**
     * @param price 价钱
     * @param add   涨价
     * @return
     */
    @Override
    public double doOperation(double price, double add) {
        return price + add;
    }
}
/**
 * 打折
 */
public class OperationDiscount implements Strategy {
    /**
     * @param price    价钱
     * @param discount 折扣
     * @return
     */
    @Override
    public double doOperation(double price, double discount) {
        return price * discount;
    }
}
/**
 * 降价
 */
public class OperationSubstract implements Strategy {
    /**
     * @param price     价钱
     * @param substract 减价
     * @return
     */
    @Override
    public double doOperation(double price, double substract) {
        return price - substract;
    }
}

执行的策略类

/**
 * 执行的策略类
 */
public class CashContext {

    private Strategy strategy;

    CashContext() {

    }

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

    public double executeStrategy(double num1, double num2) {
        return strategy.doOperation(num1, num2);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        // 创建对象
        CashContext cashContext = new CashContext();

        // 根据不同的情况,调用不同的算法
        cashContext.setStrategy(new OperationAdd());
        // 涨价:110.0
        System.out.println("涨价:" + cashContext.executeStrategy(100, 10));

        cashContext.setStrategy(new OperationDiscount());
        // 打折:80.0
        System.out.println("打折:" + cashContext.executeStrategy(100, 0.8));

        cashContext.setStrategy(new OperationSubstract());
        // 降价:90.0
        System.out.println("降价:" + cashContext.executeStrategy(100, 10));

    }
}

策略模式UML结构图

源码 - strategy分支

不同分支对应不同设计模式源码 github.com/nullaman/Ja…



JDK中的例子

Comparator接口

java.util.Comparator

import java.util.Comparator;

public class Demo implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        return 0;
    }
}
package java.util;

import java.io.Serializable;
import java.util.function.Function;
import java.util.function.ToIntFunction;
import java.util.function.ToLongFunction;
import java.util.function.ToDoubleFunction;
import java.util.Comparators;

@FunctionalInterface
public interface Comparator<T> {
    
    int compare(T o1, T o2);
    
    // ...
    
}