Java设计模式-策略模式

简介: Java设计模式-策略模式

微信截图_20220524212443.png


Java设计模式-策略模式,一起来看看吧,让我们一起为进阶做一个充足的准备吧!!!!

会了就当复习丫,不会来一起来看看吧。

很喜欢一句话:“八小时内谋生活,八小时外谋发展”。

如果你也喜欢,让我们一起坚持吧!!

共勉😁


封面:我想这才是夏天吧,心目中的夏天


设计模式系列


一、前言


1)引入:


在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,今天的作业该让这个女朋友写还是那个女朋友写勒?好难选啊,算了吧还是自己来吧。(其实就是没有😂)。正文:例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。


大家编程肯定知道,当实现某一个功能存在多种算法或者策略时,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如我们写个排序算法题,可以选择二叉树排序、快速排序、堆排序等,根据给出的条件不同,从中选出最适合的排序算法。


还有咱们作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具。


微信截图_20220524212604.png


2)概述:


策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。


策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。


3)角色结构:


策略模式的主要角色如下。


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


  1. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。


  1. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。


4)使用场景:


1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。


2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。


3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。


4、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。


5)注意事项:


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


二、案例代码


2.1、案例:


【例】促销活动


一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。


类图:


微信截图_20220524212704.png


2.2、实现:


定义百货公司所有促销活动的共同接口


public interface Strategy {
    void show();
}


定义具体策略角色(Concrete Strategy):每个节日具体的促销活动


//为春节准备的促销活动A
public class StrategyA implements Strategy {
    public void show() {
        System.out.println("春节活动:买一送一");
    }
}
//为中秋准备的促销活动B
public class StrategyB implements Strategy {
    public void show() {
        System.out.println("中秋活动:满200元减50元");
    }
}
//为圣诞准备的促销活动C
public class StrategyC implements Strategy {
    public void show() {
        System.out.println("圣诞活动:满1000元加一元换购任意200元以下商品");
    }
}


定义环境角色(Context):用于连接上下文,即把促销活动推销给客户,这里可以理解为销售员


public class SalesMan {
    //持有抽象策略角色的引用                              
    private Strategy strategy;                 
    public SalesMan(Strategy strategy) {       
        this.strategy = strategy;              
    }                                          
    //向客户展示促销活动                                
    public void salesManShow(){                
        strategy.show();                       
    }                                          
}           


客户端:


public class Client {
    public static void main(String[] args) {
        SalesMan salesMan = new SalesMan(new StrategyA());
        salesMan.salesManShow();
        System.out.println("-----------");
        SalesMan salesManB = new SalesMan(new StrategyB());
        salesManB.salesManShow();
        System.out.println("-----------");
        /**
         * 春节活动:买一送一
         * -----------
         * 中秋活动:满200元减50元
         * -----------
         */
    }
}


三、总结


优点:


  1. 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。


  1. 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。


  1. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if...else 语句、switch...case 语句。


  1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码


缺点:


  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。


  • 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。


四、自言自语


我也不知道文章写出来是有用还是无用,只是想做一个分享。希望大家能够喜欢并且在这里能有收获。


当然不可否认,我也想获得那种别人认可的那种快乐,并且能让我继续坚持。


你好啊,要天天开心哦。下篇文章再见。


此系列还在持续更新中.... 我一定还会回来的。😁


目录
相关文章
|
4月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
98 0
|
4月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
4月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
101 14
|
10月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
125 4
|
7月前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
224 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
6月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
9月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
10月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
159 6
|
10月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
97 1
|
10月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
128 2