折腾java设计模式之策略模式

大萌小路      2022-04-25     233

关键词:

博客原文地址

简介

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。简单理解就是一组算法,可以互换,再简单点策略就是封装算法。

意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用 一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决 将这些算法封装成一个一个的类,任意地替换。

主要角色

  • 上下文Context,拥有一个Strategy的引用
  • 抽象策略Strategy,往往是一个接口(占大部分情况)或者抽象类,通常提供各种具体策略的接口
  • 具体策略,这就是重点了,封装了各种具体的算法

UML

技术分享图片

应用实例

  • 诸葛亮的锦囊妙计,每一个锦囊就是一个策略;
  • 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略;
  • JAVA AWT 中的 LayoutManager;

优点 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

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

使用场景

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

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

项目描述

跳转到我的策略模式GitHub

1.操作行为

simple1包,主要对操作行为包装了加减乘除方法。

@Slf4j
public class Application {

    public static void main(String[] args) {
        Context context = new Context(new AddStrategy());
        log.info("10 + 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new SubstractStrategy());
        log.info("10 - 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new MultiplyStrategy());
        log.info("10 * 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new DivideStrategy());
        log.info("10 / 5 = {}", context.executeStrategy(10, 5));
    }
}

执行结果

技术分享图片

2.出现方式

simple2包描述,主要对出行方式的包装,包装了3种出行方式,

执行类

public class TravelApplication {

    public static void main(String[] args) {
        Context context = new Context(new BusStrategy());
        context.executeStrategy("老王");

        context.setStrategy(new BicycleStrategy());
        context.executeStrategy("老张");

        context.setStrategy(new WalkStrategy());
        context.executeStrategy("老李");
    }
}

执行结果

技术分享图片

策略上下文

@Data
public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 出行
     *
     * @return
     */
    public void executeStrategy(String name) {
        strategy.travel(name);
    }

}

抽象策略

public interface Strategy {

    /**
     * 出现方法
     *
     * @return
     */
    void travel(String name);
}

参考

策略模式

维基里的策略模式

南乡清水的实际项目运用之Strategy模式

折腾java设计模式之迭代器模式

迭代器模式Provideawaytoaccesstheelementsofanaggregateobjectsequentiallywithoutexposingitsunderlyingrepresentation.提供一种不公示其底层细节(结构)的情况下能顺序访问聚合对象元素的方法。其实在java体系中,jdk已经引入了迭代器接口以及对于的容器... 查看详情

折腾java设计模式之观察者模式

观察者模式Defineaone-to-manydependencybetweenobjectswhereastatechangeinoneobjectresultsinallitsdependentsbeingnotifiedandupdatedautomatically.直译过来就是,定义对象间的一对多依赖关系,当一个对象的状态变更会自动通知和更新所有依赖项。像发布/订阅... 查看详情

折腾java设计模式之中介者模式

博文原址:折腾Java设计模式之中介者模式中介者模式中介者模式(MediatorPattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中... 查看详情

折腾java设计模式之单例模式(代码片段)

博文原址:折腾Java设计模式之单例模式单例模式Ensureaclasshasonlyoneinstance,andprovideaglobalpointofaccesstoit.一个类仅仅只有一个实例,并且提供全局的接入点。简洁点理解就是涉及到一个单一的类,该类负责创建自己的对象,同时确保... 查看详情

折腾java设计模式之解释器模式

解释器模式解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。意图给定一个语言,定义它的文法表示,并... 查看详情

java设计模式之策略模式

    策略模式属于对象的行为模式,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情

折腾java设计模式之解释器模

解释器模式解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。意图给定一个语言,定义它的文法表示,并... 查看详情

java设计模式之策略模式

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

java之策略模式(大话设计模式)

温故而知新,每次读设计模式都会有不同的体验,坚持每天一个设计模式,直到熟练运用设计模式。策略模式定义了很多完成相同工作的算法,但实现不同,它可以以相同的方式调用所有的算法,减少了算法和调用算法的耦合。... 查看详情

java设计模式之——策略模式

1、策略模式有什么好处?    策略模式的好处在于你可以动态的改变对象的行为。2、设计原则    设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类... 查看详情

设计模式之-策略模式

1、策略模式定义:将一系列算法封装起来,为了以后可以互相替换使用,由策略类和context组成,context接受用户信息,然后将请求委托给策略类(现实生活中,我们要去一个城市,交通方式就有:飞机、高铁、开车、大巴等,这... 查看详情

java策略模式之总有你想不到的知识(代码片段)

文章目录策略模式概念代码示例优缺点策略模式优点策略模式缺点应用场景综合实战:多个算法切换策略模式概念策略模式(StrategyPattern)也叫政策模式,是一种比较简单的模式。它的目的是定义一组算法,... 查看详情

设计模式之策略模式

  把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用这些模式。(经验复用)  ==    当涉及【维护】时,为了【复用】目的而使用继承,结局并不完美。  ==  把问题归零。  现在我们知... 查看详情

java设计模式之策略学习与掌握(代码片段)

...结构与实现模式的结构模式的实现应用场景前言个人建议设计模式这一系列的文章,多关注定义和模式的代码实现。至于模式结构和扩展或者是应用场景,基本了解过一下就好,没必要硬记。这只是我的个人建议࿰... 查看详情

多线程之策略模式

...始就复习了一下多线程编程,今天给各位分享一种Java23种设计模式中最常见的设计模式--策略模式。为什么将策略模式和多线程绑在一起呢,不知道各位有没有注意过我们在进行多线程编程的时候,创建线程的方式有2种,一种是... 查看详情

设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)(代码片段)

...束之后经过点拨发现在整个项目重构的过程中没有使用到设计模式里的思想,导致整个项目不太符合低耦合高内聚设计原则。所以决定在学习设计模式后,进行一个简单的小项目来练习使用设计模式。本次选择了简单工... 查看详情

设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)(代码片段)

...束之后经过点拨发现在整个项目重构的过程中没有使用到设计模式里的思想,导致整个项目不太符合低耦合高内聚设计原则。所以决定在学习设计模式后,进行一个简单的小项目来练习使用设计模式。本次选择了简单工... 查看详情