一天一个设计模式:策略模式

概念:

策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响客户端的情况下变化。

结构:

环境(Context)角色:持有一个Strategy的引用。

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。

具体策略(ConcreteStrategy)角色:包含具体场景的算法。

代码示例:

环境角色:

public class Context {
    //持有一个具体策略的对象
    private Strategy strategy;
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){
        
        strategy.strategyInterface();
    }
    
}

抽象策略类:

public interface Strategy {
    /**
     * 策略方法
     */
    public void strategyInterface();
}

具体策略类:

public class ConcreteStrategyA implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }

}

//后面两个重复这个类

使用常见:

我们以手抓饼订单为例,即有普通手抓饼,高级手抓饼,顶级手抓饼。

场景就是接单类,根据具体的算法来生产不同的手抓饼订单。

接单类:

public class ReceiveOrder {
    private ShouzhuabingOrder shouzhuabingOrder;

    public ReceiveOrder(ShouzhuabingOrder shouzhuabingOrder) {
        this.shouzhuabingOrder = shouzhuabingOrder;
    }

    //其实这我们可以对该函数进行一些功能强化,让其在算法选择的基础上进行一些功能的扩展
    //具体的可以参考java中Collections类下面的sort方法。
    //例如我们可以通过参数作为输入,相当于用户除了做定制化的手抓饼外,还可以再次基础上进行个性化的定制。
    public String makeOrder() {
        return shouzhuabingOrder.makeOrder();
    }
}

手抓饼订单接口:

public interface ShouzhuabingOrder {

    public String makeOrder();
}

普通手抓饼:

public class OriginOrder implements ShouzhuabingOrder {
    @Override
    public String makeOrder() {
        return "我是基础的手抓饼,只有一张饼,一个蛋还有各种酱";
    }
}

高档手抓饼:

public class MediumOrder implements ShouzhuabingOrder {

    @Override
    public String makeOrder() {
        return "我是一个中级手抓饼,自带一张饼,两个蛋,还有自制酱料";
    }
}

豪华手抓饼:

public class HighOrder implements ShouzhuabingOrder {
    @Override
    public String makeOrder() {
        return "我是高级手抓饼,我有一张饼,两个蛋,一个里脊,一个薄脆还有自制酱料。";
    }
}

实际的接受订单的过程:

public class Test {
    public static void main(String[] args) {
        HighOrder highOrder = new HighOrder();

        ReceiveOrder receiveOrder = new ReceiveOrder(highOrder);

        System.out.println(receiveOrder.makeOrder());
    }
}

策略模式的核心:

  不管算法的实现,而是对算法做一个选择,组织,调用,从而使程序在结构上更加清晰,也更加方便维护和扩展。

策略模式的平等性:

  算法的地位相同,可以相互替换,相互无依赖,策略模式中的算法关系未:相同行为的不同实现。

策略模式运行时的唯一性:

  运行时,每一个时刻只能使用一个具体的策略实现对象,虽然可以动态切换,但是在同一时刻,只能是一个。

共有行为:

  若所有算法均有具体的行为,可以将算法接口改成抽象类,同时共有的行为进行定义。

策略模式的优点:

  1.策略模式提供了管理相关算法的算法族的方法,可以将部分共有代码移到父类,从而避免重复。

  2.使用策略模式,可以避免重复条件的判定(if-else)。

策略模式的缺点:

  1.客户端必须知道所有的策略,并自行决定使用哪种策略,以便选用合适的算法。(我还没有想明白这点,这自行判断还不是要依赖if else)

  2.备选的策略多的话,类的数量会很多,不方便管理。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吉浦迅科技

DAY37:阅读不同存储器的修饰符

14040
来自专栏积累沉淀

Java设计模式(十三)----策略模式

策略模式 一、概述 二、策略模式的结构 三、具体案例 四、认识策略模式 一、概述 1.定义 策略模式属于对象行为型模式,主要针对一组算法...

23460
来自专栏Java编程技术

UML建模(类图)

类图是面向对象系统建模中重要的图,是定义其它图的基础。类图主要是用来展现软件系统中的类、接口以及它们之间的静态结构。

15620
来自专栏小小挖掘机

数据城堡参赛代码实战篇(二)---使用pandas进行数据去重

小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,分组第19名的成绩进入了复赛,很激动有木有!在上一篇文章中,小编带你使用pandas并结合官方给...

38680
来自专栏IT可乐

深入理解计算机系统(5.1)------优化程序性能

  你能获得的对程序最大的加速比就是当你第一次让它工作起来的时候。   在讲解如何优化程序性能之前,我们首先要明确写程序最主要的目标就是使它在所有可能的情况下都...

257100
来自专栏申龙斌的程序人生

零基础学编程005:打印一行复利数据

问题 上次文章《集成开发环境IDE》里留了一道练习题: 如何用Python打印这篇枯燥的《复利数据表》: (1+0.01) ^ 1 = 1.01 (1+0.0...

34390
来自专栏tkokof 的技术,小趣及杂念

iTween那些事儿(二)

  上次我们简单浏览了一番iTween的使用和原理,这次我们换个角度,转而看看iTween目前存在的一些缺陷以及一点点可能的改进之处,当然,这些所谓的缺陷或者改...

8010
来自专栏听雨堂

数据库范式

关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另有第四范式和第五...

21560
来自专栏圣杰的专栏

EF Core中避免贫血模型的三种行之有效的方法

17040
来自专栏牛客网

面经总结

面试记录 头条 - 一面 - 自我介绍 - 连续子数组的最大和 - 二叉树任意两个节点之间路径的最大长度 - 二叉树的深度 - 一面上个周只记得这么多了 - 二...

40970

扫码关注云+社区

领取腾讯云代金券