小白谈谈策略模式

概念

策略指的是完成同一件事的不同方式,比如说广州到北京,可以坐飞机,坐火车,还可以自驾等,这些不同的方式就可以称为策略。在策略模式中,一个类的行为或其算法可以在运行时更改,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象,策略对象改变 context 对象的执行算法。


介绍

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。

优点
1、算法可以自由切换
2、避免使用多重条件判断
3、高内聚低耦合,而且还有很好的扩展性

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

使用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
2、一个系统需要动态地在几种算法中选择一种
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现

注意:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。


实现代码:

假设场景:老师对不同考试成绩的学生方式不同,分别是三种方式,对待优异的学生奖励小红花,对待成绩一般的学生进行鼓励,对待成绩差的学生安排更过的作业
在这里插入图片描述
首先创建对待学生这个接口:

public interface Strategy {

    public void operate();
}

再完成对待三种学生的不同方式的具体实现
对待成绩优异的学生:

public class GiveFlower implements Strategy {

    @Override
    public void operate() {
        System.out.println("奖励小红花");
    }
}

对待成绩一般的学生:

public class Encourage implements Strategy {
    
    @Override
    public void operate() {
        System.out.println("给予鼓励");
    }
}

对待成绩差的学生:

public class GiveMoreHw implements Strategy {
    @Override
    public void operate() {
        System.out.println("安排更多的作业!");
    }
}

定义应用场景:

public class Context {
    private Strategy strategy;

    //构造函数看我使用哪个策略
    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    //使用策略
    public void operate(){
        this.strategy.operate();
    }
}

定义老师类,进行策略的应用:

public class Teacher {

    public static void main(String[] args) {

        //安排班会课
        Context context;

        //对待成绩优异的学生
        System.out.println("谈到成绩优异的学生的时候");
        context =  new Context(new GiveFlower());
        context.operate();

        //对待成绩一般的学生
        System.out.println("谈到成绩一般的学生的时候");
        context =  new Context(new Encourage());
        context.operate();

        //对待成绩差的学生
        System.out.println("谈到成绩差的学生的时候");
        context =  new Context(new GiveMoreHw());
        context.operate();
    }
}

若是还需要对学生进行区分,实施不同的策略,则在新的策略中调用strategy的接口,然后填写上具体的实现即可,大大有利于拓展。

本文参考:https://www.runoob.com/design-pattern/strategy-pattern.html
本文的实现代码:https://pan.baidu.com/s/18mN2ob-sHKkpaA8k0gL_0A
提取码:9ejr

发布了48 篇原创文章 · 获赞 0 · 访问量 668

猜你喜欢

转载自blog.csdn.net/weixin_44943485/article/details/105138637
今日推荐