** 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);
// ...
}