设计模式学习之锦囊妙计定乾坤

定义:

        策略模式很简单,最基本的理解是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。更通俗的讲,就是每个封装的算法名都是一样的,而且算法类都是隶属一个父类。而如何实现互换呢,而互换实际只的是由调用方来决定调用哪个算法,而且之前不受影响。

重点:算法封装、算法互换

实现方式:

需求:小明的妈妈给了小明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判断,策略模式是个不错的现在。
  • 策略模式的缺点:策略会很多,而且策略类大多都不可复用;策略类的完全暴露不符合迪米特法则,需要用其他方式弥补。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值