设计模式--策略模式

这篇具有很好参考价值的文章主要介绍了设计模式--策略模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.场景

1.1场景

2.2 何时使用

 2.3个人理解

二. 业务场景练习

 2.1业务:

2.2具体实现

2.3思路 

 三.总结

3.1策略模式的特点:

 3.2策略模式优点

3.3策略模式缺点


一.场景

1.1场景

  1. 许多相关的类仅仅是行为有异,也就是说业务代码需要根据场景不同,切换不同的实现逻辑
  2. 一个类定义了多种行为,并且这些行为在类的操作中以多个条件语句的形式出现,也就是说代码中存在大量 if else 逻辑判断

2.2 何时使用

   当一件任务可以使用不同的方式来完成,就可以使用策略模式 

 2.3个人理解

  策略模式简单理解,应该是对于同一个业务功能,在不同的场景需求下提供不同的实现逻辑,来达到动态切换业务算法,满足不同场景的目的。同时它也有另外的好处,即优化代码结构,使其脱离大量逻辑判断,对外只提供 Context上下文,让算法与实际业务代码解耦,对使用者屏蔽底层实现逻辑。

  对于我们根据不同的场景, 会定义应对不同场景相应的方法, 然而这些方法就是我们的策略, 

策略模式 UML类图如下:

设计模式--策略模式,设计模式,设计模式,策略模式,java

 每个策略通过不同业务条件, 找到相应的算法类或逻辑类 , 最终得到想要的结果 

二. 业务场景练习

 2.1业务:

     我们出行会根据不同的交通方式,制定不同的出行方式,比如:自驾、大巴车、高铁、飞机,而每出行方式就是一个定义一个策略。

2.2具体实现

首先:定义一个出行接口

/**
 * 描述:出行策略接口
 *
 * @author QU
 * @date 2023/8/10
 */
public interface TripModeStrategy {
    void tripModeStrategy();
}

策略一:自驾出行

/**
 * 描述: 自驾出行
 *
 * @author QU
 * @date 2023/8/10
 */
public class CarTripStrategy implements TripModeStrategy {

    @Override
    public void tripModeStrategy() {
        System.out.println("自驾出行,花费200元,用时6个小时");
    }
}

策略二:大巴出行

/**
 * 描述: 公交车出行
 *
 * @author QU
 * @date 2023/8/10
 */
public class BusTripStrategy implements TripModeStrategy {
    @Override
    public void tripModeStrategy() {
        System.out.println("公交车出行,花费100元,用时8个小时");
    }
}

策略三:高铁出行

/**
 * 描述: 高铁出行
 *
 * @author QU
 * @date 2023/8/10
 */
public class HighSpeedTripStrategy implements TripModeStrategy {
    @Override
    public void tripModeStrategy() {
        System.out.println("高铁出行,花费500元,用时2.5小时");
    }
}

策略四:飞机出行

/**
 * 描述: 飞机出行
 *
 * @author QU
 * @date 2023/8/10
 */
public class AircraftTripStrategy implements TripModeStrategy {
    @Override
    public void tripModeStrategy() {
        System.out.println("飞机出行,花费1000元,用时1个小时");
    }
}

制定策略输出类

package strategy.trip;

/**
 * 描述: 策略输出
 *
 * @author QU
 * @date 2023/8/10
 */
public class TripMode {
    //注入策略
    private TripModeStrategy tripModeStrategy;

    TripMode(TripModeStrategy tripModeStrategy){
        this.tripModeStrategy=tripModeStrategy;
    }
    //输出具体策略
    public void executeTripStrategy(){
        tripModeStrategy.tripModeStrategy();
    }
}

制定策略工厂

/**
 * 描述: 策略工厂
 *
 * @author QU
 * @date 2023/8/10
 */
public class TripStrategyFactory {
    /**
     * 定义map存放所有策略.
     */
    private static final Map<String,TripModeStrategy> TRIP_MODE_STRATEGY_MAP=new HashMap<>();

    /**
     * 使用静态方法来加载策略到map中
     */
    static{
        TRIP_MODE_STRATEGY_MAP.put(TripEnum.CAR,new CarTripStrategy());
        TRIP_MODE_STRATEGY_MAP.put(TripEnum.BUS,new BusTripStrategy());
        TRIP_MODE_STRATEGY_MAP.put(TripEnum.HIGH_SPEED,new HighSpeedTripStrategy());
        TRIP_MODE_STRATEGY_MAP.put(TripEnum.AIRCRAFT,new AircraftTripStrategy());
    }

    /**
     * 使用静态方法通过模拟客户端传接的类型(参数)
     *
     * @param key 策略类型(客户端用户选择的出行方式)
     * @return 具体某条策略
     */
    public static TripModeStrategy tripModeStrategy(String key){
        TripModeStrategy tripModeStrategy = TRIP_MODE_STRATEGY_MAP.get(key);
        return tripModeStrategy;
    }

制定出行类型(出行常量)也可以认为我们wed或实际开发项目中的客户端选择的一条策略(用户选择的出行方式)

/**
 * 描述: 出行常量
 *
 * @author QU
 * @date 2023/8/10
 */
public class TripEnum {
    public static final String CAR="car";
    public static final String BUS="bus";
    public static final String HIGH_SPEED="high_speed";
    public static final String AIRCRAFT="aircraft";
}

测试类:

/**
 * 描述: 测试出行方式
 *
 * @author QU
 * @date 2023/8/10
 */
public class TripTest {
    public static void main(String[] args) {
        //自驾
        TripModeStrategy tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.CAR);
        //大巴车
         //tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.BUS);
        //高铁
         //tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.HIGH_SPEED);
        //飞机
        tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.AIRCRAFT);
        TripMode tripMode=new TripMode(tripModeStrategy);
        tripMode.executeTripStrategy();
    }
}

运行结果:这里根据程序运行选择就近原则(最后取变量值),预测是策略四飞机出行

结果:

设计模式--策略模式,设计模式,设计模式,策略模式,java

2.3思路 

  1. 首先根据业务制定出行策略(TripModeStrategy )
  2. 制定策略工厂将策略装进我们的静态代码块在工程启动已执行到map中,静态方法等待调用(tripModeStrategy(String key))
  3. 制定策略输出类,通过客户端选择出行方式去策略工厂中获取静态方法输出策略

 三.总结

3.1策略模式的特点:

高内聚低耦合,可扩展,遵循ocp原则(开放封闭原则)

 3.2策略模式优点

1.策略模式的功能就是通过抽象、封装来定义一系列的算法,使得这些算法可以相互替换,所以为这些算法定义一个公共的接口,以约束这些算法的功能实现。如果这些算法具有公共的功能,可以将接口变为抽象类,将公共功能放到抽象父类里面。

2.策略模式的一系列算法是可以相互替换的、是平等的,写在一起就是if-else组织结构,如果算法实现里又有条件语句,就构成了多重条件语句,可以用策略模式,避免这样的多重条件语句。

3.扩展性更好:在策略模式中扩展策略实现非常的容易,只要新增一个策略实现类,然后在使用策略实现的地方,使用这个新的策略实现就好了。

3.3策略模式缺点

1.客户端必须了解所有的策略,清楚它们的不同:

如果由客户端来决定使用何种算法,那客户端必须知道所有的策略,清楚各个策略的功能和不同,这样才能做出正确的选择,但是这暴露了策略的具体实现。

2.增加了对象的数量:

由于策略模式将每个具体的算法都单独封装为一个策略类,如果可选的策略有很多的话,那对象的数量也会很多。

3.只适合偏平的算法结构:

由于策略模式的各个策略实现是平等的关系(可相互替换),实际上就构成了一个扁平的算法结构。即一个策略接口下面有多个平等的策略实现(多个策略实现是兄弟关系),并且运行时只能有一个算法被使用。这就限制了算法的使用层级,且不能被嵌套。文章来源地址https://www.toymoban.com/news/detail-647943.html

到了这里,关于设计模式--策略模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式之策略(Strategy)模式

    策略(Strategy)设计模式定义了一系列算法,将它们封装起来,并且可以相互替换使用,从而使得算法可以独立于使用它的客户而变化。 策略(Strategy)设计模式是一种行为型设计模式,它允许在运行时动态地选择算法。策略模式将算法封装为算法族,从而可以在运行时根据

    2024年02月15日
    浏览(32)
  • Java设计模式—策略模式(Strategy Mode)

    目录 前言 一、策略模式的简介 二、策略模式的概念 三、策略模式的作用 四、策略模式的优、缺点 策略模式的优点: 策略模式的缺点: 五、策略模式应用场景 六、代码案例 1)抽象接口类 2)具体的策略类:减 3)具体策略类:打折 4)上下文类 5)客户端Main代码测试 总结

    2024年02月08日
    浏览(31)
  • Java设计模式-策略模式-基于Spring实现

    策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装在 独立的策略类 中,使得它们可以相互替换,而不影响客户端代码。这种模式通过 将算法的选择从客户端代码中分离出来 ,提供了更大的灵活性和可维护性。 在Java中,策略模式的设计理念可以

    2024年02月08日
    浏览(45)
  • Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

            在平时的开发中,涉及到设计模式的有两块内容,第一个是我们 平时使用的框架 (比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。         面试官一般比较关心的是你在开发过程中, 有没有使用过设计模式,或者你在简历上写了关于设计

    2024年02月10日
    浏览(39)
  • 【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有各种鸭子,比如野鸭、北京鸭、水鸭等。 鸭子有各种行为,比如走路、叫、飞行等。不同鸭子的行为可能略有不同。要求显示鸭子的信息 不同的鸭子继承一个父类Duck,如果是相同的行为就继承,不同行为就重写方法 实现 【鸭子抽象类】 【野鸭】 【北京鸭】 【玩具鸭】

    2024年02月12日
    浏览(43)
  • 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    策略模式(Strategy Pattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。 当你想使用对象中各种不同的算法变体,使用if...else 所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅

    2024年02月01日
    浏览(25)
  • [设计模式]行为型模式-策略模式

    策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变换不会影响使用算法的客户。 在项目开发中,我们经常要根据不同的场景,采取不同的措施,也就是不同的策略。假设我们需要对a、b这两个整数进行计算,根据条件的不同,需要执行不

    2024年02月19日
    浏览(29)
  • 设计模式-策略模式

    策略模式是一种行为型设计模式,它允许在运行时动态改变对象的行为。在策略模式中,算法被封装在独立的策略类中,使得它们可以互换使用。下面是一个简单的例子: 假设我们有一个计算税收的系统,现在需要计算不同类型的商品的税收,例如书籍、食品和服装。每种商

    2024年02月15日
    浏览(33)
  • 设计模式--策略模式

    目录 一.场景 1.1场景 2.2 何时使用  2.3个人理解 二. 业务场景练习  2.1业务: 2.2具体实现 2.3思路   三.总结 3.1策略模式的特点:  3.2策略模式优点 3.3策略模式缺点 1.1场景 许多相关的类仅仅是行为有异,也就是说业务代码需要根据场景不同,切换不同的实现逻辑 一个类定义了

    2024年02月13日
    浏览(29)
  • 【设计模式】 策略模式

    策略模式 (Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,使它们可以相互替换,让客户端代码和算法的具体实现解耦。这样,客户端可以根据不同的需求选择不同的算法,而无需修改原有的代码。 灵活性增强 :策略模式使得算法独立于

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包