设计模式——策略模式

本文介绍策略模式的概念及其在解决同一问题不同处理方式的应用。通过实例演示如何利用策略模式封装多种算法,实现灵活选择并提高代码可读性和扩展性。

    策略模式(Strategy Pattern),定义了一系列算法,并将每个算法封装起来,当使用者使用时可以根据情况相互替换。通常当一个问题需要考虑很多情况来解决时,我们会选择 if-else 或者 switch-case 语句,但是如果情况过多或者太复杂,会导致我们的程序特别臃肿,比较混乱、复杂,而且修改起来特别的麻烦。而使用策略模式便可以将各个情况分离开,然后通过使用者来决策,选择不同的办法。

    

    策略模式主要包含三个部分:操纵者、抽象策略、具体策略。

    操作者:如图中的 Context,用来操作策略的上下环境,持有对抽象策略的引用。

    抽象策略:如图中的 Strategy,策略的抽象,给出所有具体策略类所需实现的接口。

    具体策略:如图中的 StrategyA、StrategyB,继承自抽象策略,包装了该策略的算法。

    下面我们通过一个具体的例子来对策略模式进行一下简单的实现。比如我们要学习设计模式有三种方法:通过购买书籍、通过视频学习、通过 优快云 博客,三种方式需要不同的金钱和时间付出,比如一个人对于金钱和时间态度付出的预算是 4:6,那我们策略模式来实现一下三种学习方式需要付出的精力:

  • 创建一个抽象策略 LearnStrategy.java,实现策略的接口:
public interface LearnStrategy {
    //返回需要付出的学习精力
    int learnMethod();
}
  • 实现三种具体策略 StrategyA.java、StrategyB.java、StrategyC.java,继承自 Strategy:
//通过书籍学习
public class StrategyA implements LearnStrategy {
    @Override
    public int learnMethod() {
        //一本书籍 50 元,看完花费时间 30 天
        int money = 50;
        int time = 30;
        return money*4 + time*6;
    }
}
//通过视频学习
public class StrategyB implements LearnStrategy{
    @Override
    public int learnMethod() {
        //一套视频 30 元,看完花费时间 40 天
        int money = 30;
        int time = 40;
        return money*4 + time*6;
    }
}
//通过 优快云 学习
public class StrategyC implements LearnStrategy {
    @Override
    public int learnMethod() {
        //优快云花费 0 元,看完花费时间 60 天
        int money = 50;
        int time = 30;
        return money*4 + time*6;
    }
}
  • 实现操作者 ChooseMethod.java,联系上下环境,选择学习方式:
public class ChooseMethod {
    public static void main(String[] args) {
        ChooseMethod methodA = new ChooseMethod();
        methodA.setStrategy(new StrategyA());
        System.out.println("书籍学习花费精力:"+methodA.learnMethod());
        ChooseMethod methodB = new ChooseMethod();
        methodB.setStrategy(new StrategyB());
        System.out.println("视频学习花费精力:"+methodB.learnMethod());
        ChooseMethod methodC = new ChooseMethod();
        methodC.setStrategy(new StrategyC());
        System.out.println("优快云学习花费精力:"+methodC.learnMethod());

    }

    //传入策略
    LearnStrategy strategy;
    public void setStrategy(LearnStrategy strategy){
        this.strategy = strategy;
    }
    //得到结果
    public int learnMethod(){
        return strategy.learnMethod();
    }
}

    结果如下:


    那么策略模式有什么优点呢?我们可以自由的切换策略,选择实现想要的情况得到的结果,不必把所有的结果都尝试一次,而且易于拓展,当我们有更多策略的时候只需要继承自抽象策略,重写方法,然后就可以在操作者出得到结果,并且放弃了 if-else 和 switch-case,使得代码更加清晰,可阅读性更强,也更贴合面对对象的思想。

  • 策略模式试用场景

    第一种是针对同一种问题的不同处理方式

    第二种是出现同一个抽象类有很多子类又需要选择使用的子类的时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值