策略模式 深碍√TFBOYSˉ_ 2021-08-31 02:47 544阅读 0赞 ### 策略模式 ### * 1. 模式动机 * 2. 模式定义 * 3. 模式结构 * 4. 时序图 * 5. 代码分析 * 6. 模式分析 * 7. 优点 * 8. 缺点 * 9. 适用环境 # 1. 模式动机 # * 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。 * 在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。 * 在软件系统中,有许多算法可以实现某一功能,如查找、排序等,一种常用的方法是硬编码(`Hard Coding`)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过`if…else…`等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。 * 除了提供专门的查找算法类之外,还可以在客户端程序中直接包含算法代码,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。 * 为了解决这些问题,可以定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法,在这里,每一个封装算法的类我们都可以称之为策略(`Strategy`),为了保证这些策略的一致性,一般会用一个抽象的策略类来做算法的定义,而具体每种算法则对应于一个具体策略类。 # 2. 模式定义 # 策略模式(`Strategy Pattern`):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(`Policy`)。 策略模式是一种对象行为型模式。 # 3. 模式结构 # 策略模式包含如下角色: * `Context`: 环境类 * `Strategy`: 抽象策略类 * `ConcreteStrategy`: 具体策略类 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfemhhb18_size_16_color_FFFFFF_t_70] # 4. 时序图 # ![在这里插入图片描述][20200707115711863.png_x-oss-bmV0L3dhbmdfemhhb18_size_16_color_FFFFFF_t_70] # 5. 代码分析 # 1. 抽象策略类 package strategy; /** * @author wangzhao * @date 2020/7/7 12:21 */ public abstract class Strategy { public abstract void algorithm(); } 1. 具体策略类A package strategy; /** * @author wangzhao * @date 2020/7/7 12:22 */ public class ConcreteStrategyA extends Strategy { @Override public void algorithm() { System.out.println("ConcreteStrategyA"); } } 1. 具体策略类B package strategy; /** * @author wangzhao * @date 2020/7/7 12:22 */ public class ConcreteStrategyB extends Strategy { @Override public void algorithm() { System.out.println("ConcreteStrategyB"); } } 1. 环境类 package strategy; /** * @author wangzhao * @date 2020/7/7 12:24 */ public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public void algorithm(){ this.strategy.algorithm(); } } 1. 客户端类 package strategy; /** * @author wangzhao * @date 2020/7/7 12:26 */ public class Client { public static void main(String[] args) { Strategy strategy = new ConcreteStrategyA(); Context context = new Context(strategy); context.algorithm(); strategy = new ConcreteStrategyB(); context = new Context(strategy); context.algorithm(); } } ![在这里插入图片描述][20200707122720197.png] # 6. 模式分析 # * 策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。 * 在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。 * 策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。 # 7. 优点 # 策略模式的优点 * 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。 * 策略模式提供了管理相关的算法族的办法。 * 策略模式提供了可以替换继承关系的办法。 * 使用策略模式可以避免使用多重条件转移语句。 # 8. 缺点 # 策略模式的缺点 * 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。 * 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。 # 9. 适用环境 # 在以下情况下可以使用策略模式: * 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 * 一个系统需要动态地在几种算法中选择一种。 * 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。 * 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfemhhb18_size_16_color_FFFFFF_t_70]: /images/20210813/1ef9a54b7df2445baf7a891ccc952cb2.png [20200707115711863.png_x-oss-bmV0L3dhbmdfemhhb18_size_16_color_FFFFFF_t_70]: /images/20210813/0aff348a15714ddaae5932ce9e94d826.png [20200707122720197.png]: /images/20210813/af3d6bebdede4c74ac557759765999f5.png
相关 策略模式 1. 定义 > 定义一系列算法,把他们一个个封装起来,并且使他们可以互相替换。本模式使得算法 > 可以独立于使用它的客户而变化。 2. 策略模式的结构 ![策 川长思鸟来/ 2022年05月29日 04:09/ 0 赞/ 55 阅读
相关 策略模式 前言 1、面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同的属性和功能的对象的抽象集合才是类。 2、简单工厂也能解决问题,但是 港控/mmm°/ 2021年12月08日 16:21/ 0 赞/ 314 阅读
相关 策略模式 用了也不知道用了的典型。 就是接口存在的意义,意图和实现分离。 就好像1+1=2,实现了一个简单加法一样。。。 转载于:https://www.cnblogs.com/l 曾经终败给现在/ 2021年11月27日 06:14/ 0 赞/ 314 阅读
相关 策略模式 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略 亦凉/ 2021年09月29日 15:56/ 0 赞/ 295 阅读
相关 策略模式 策略模式(Strategy):定义了一系列算法家族,将每种算法分别封装起来,使得各种算法之间可以互相替换。策略模式可以让算法的变化不影响使用算法的客户,符合开放- 桃扇骨/ 2021年09月22日 23:22/ 0 赞/ 278 阅读
相关 策略模式 13.策略模式 class Program { static void Main(string[] args) 本是古典 何须时尚/ 2021年09月17日 00:00/ 0 赞/ 406 阅读
相关 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为 忘是亡心i/ 2021年09月16日 23:00/ 0 赞/ 445 阅读
相关 策略模式 策略模式 1. 模式动机 2. 模式定义 3. 模式结构 4. 时序图 5. 代码分析 6. 模式分析 7. 优点 8. 深碍√TFBOYSˉ_/ 2021年08月31日 02:47/ 0 赞/ 545 阅读
相关 策略模式 面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 策略模式:定义了算法家族,分别封装起来,让它们之间... 灰太狼/ 2020年11月29日 04:23/ 0 赞/ 617 阅读
还没有评论,来说两句吧...