定义:
策略模式很简单,最基本的理解是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。更通俗的讲,就是每个封装的算法名都是一样的,而且算法类都是隶属一个父类。而如何实现互换呢,而互换实际只的是由调用方来决定调用哪个算法,而且之前不受影响。
重点:算法封装、算法互换
实现方式:
需求:小明的妈妈给了小明10块零花钱,小明走到了炸鸡店门口,但是开始由于了到底是买鸡腿呢还是买鸡翅呢?
设计思路:小明的10快钱的消费方式就是算法的核心,会有三种情况:1.都买鸡腿,2.都买鸡翅,3.鸡腿和鸡翅 混合买。设计一个消费算法抽象类SaleStrategy,三个具体的实现方式。消费10快钱封装为consumeContext类。
类图:
代码实现:
/**
* 策略模式
* 算法抽象类
*/
public abstract class Strategy {
protected abstract void plan();
}
/**
* 策略模式
* 策略1:全部买鸡腿
*/
public class SaleStrategy1 extends Strategy{
@Override
protected void plan() {
System.out.println("全部可以三个鸡腿还剩一块钱");
}
}
/**
* 策略模式
* 策略2:全部买鸡翅
*/
public class SaleStrategy2 extends Strategy{
@Override
protected void plan() {
System.out.println("全部正好可以买5个鸡翅");
}
}
/**
* 策略模式
* 策略3:鸡翅和鸡腿都买
*/
public class SaleStrategy3 extends Strategy{
@Override
protected void plan() {
System.out.println("全部可以买2个鸡腿和2个鸡翅");
}
}
/**
* 策略模式
* 消费行为
*/
public class ConsumeContext {
private Strategy strategy;
public ConsumeContext(Strategy strategy){
this.strategy = strategy;
}
public void consume(){
this.strategy.plan();
}
}
/**
* 策略模式测似类
*/
public class TestStrategy {
public static void main(String[] args) {
//策略1
Strategy strategy1 = new SaleStrategy1();
ConsumeContext context1 = new ConsumeContext(strategy1);
context1.consume();
//策略2
Strategy strategy2 = new SaleStrategy2();
ConsumeContext context2 = new ConsumeContext(strategy2);
context2.consume();
//策略3
Strategy strategy3 = new SaleStrategy3();
ConsumeContext context3 = new ConsumeContext(strategy3);
context3.consume();
}
}
//测似结果
全部可以三个鸡腿还剩一块钱
全部正好可以买5个鸡翅
全部可以买2个鸡腿和2个鸡翅
上述代码中对于如何消费10块钱提供了三种策略,每个策略的都提供了消费方法并且都是基于Strategy类实现。在设计过程中,选择的消费方式传入的是Strategy,所以三种策略方法可以互换使用。父类出现的地方,子类都可以出现。
总结:
- 策略模式的优点:显而易见的高扩展性,新增场景时,很轻松能扩展算法类。算法可以自由切换,通俗的讲就是想用哪个用哪个,这是也可以理解为接口的调用。同时避免了多重语句的判断,与其多重的if else判断,策略模式是个不错的现在。
- 策略模式的缺点:策略会很多,而且策略类大多都不可复用;策略类的完全暴露不符合迪米特法则,需要用其他方式弥补。