策略模式(Strategy Pattern)

一、策略模式

在策略(Strategy Pattern)中,一个类的行为或算法可以在运行时动态的更改。这种类型的设计模式属于行为模式(Behavioral Pattern-对象间通信)。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。

二、介绍

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

Define a family of algorithms, encapsulate each one, and make them interchangeable

主要解决: 在有多种算法相似的情况下,使用if...else 所带来的复杂和难以维护。
何时使用: 一个系统中有许多许多类,而区分它们的只是它们直接的行为。
如何解决: 将这些算法封装成一个一个类,任意替换。
关键代码: 实现同一个接口。
应用实例:

  1. 诸葛亮的锦囊妙计,每个锦囊就是一个策略。
  2. 旅行的出游方式,选择,️,,,,每一种旅行方式都是一个策略。
  3. Java AWT 中的LayoutManager。(这个不熟悉)

优点:

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

缺点:

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

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

三、实现

类结构图如下:

策略模式类图.png

  • Context角色:起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
  • Strategy抽象策略角色:策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
  • ConcreteStrategy具体策略角色:实现抽象策略中的操作,该类含有具体的算法。
  1. 创建策略接口(Strategy):
    public interface Strategy {
     int doOperation(int operator1, int operator2);
    }
  2. 创建策略具体算法实现类(OperationAdd、OperationMultiply、OperationSubstract):
    public class OperationAdd implements Strategy {
     @Override
     public int doOperation(int operator1, int operator2) {
         return operator1 + operator2;
     }
    }
  3. 创建Context类:
    public class Context {
     private Strategy strategy;
    
     public Context(Strategy strategy) {
         this.strategy = strategy;
     }
    
     public int executeStrategy(int operator1, int operator2) {
         return strategy.doOperation(operator1, operator2);
     }
    
     public void setStrategy(Strategy strategy) {
         this.strategy = strategy;
     }
    }
  4. 使用 Context 来查看当它改变策略 Strategy 时的行为变化。
    public class Test {
     public static void main(String[] args) {
         int operator1 = 10;
         int operator2 = 2;
         int result = 0;
    
         Context ctx = new Context(new OperationAdd());
         result = ctx.executeStrategy(operator1, operator2);
         System.out.println(operator1 + " + " + operator2 + " = " + result);
    
         ctx.setStrategy(new OperationMultiply());
         result = ctx.executeStrategy(operator1, operator2);
         System.out.println(operator1 + " * " + operator2 + " = " + result);
    
         ctx.setStrategy(new OperationSubstract());
         result = ctx.executeStrategy(operator1, operator2);
         System.out.println(operator1 + " - " + operator2 + " = " + result);
    
     }
    }
  5. 结果

    输出结果.png

时间: 2024-11-02 08:44:40

策略模式(Strategy Pattern)的相关文章

解读设计模式:策略模式(Strategy Pattern)

一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应用OOP的设计过程演化(三)这篇文章里应用到了策略模式,在图书的租金计算上分多种情况,每一种不同类型的图书的租金是不一样的,而站在用户的角度来看,不同类型用户的租金收取又是不一样的,见下面分析: 计算机类图书:会员租借打5折,普通顾客租借打6折. 小说类图书:会员租借打6折,普通顾客租借打8折. 生活类图书:会员租借打9

设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式"."状态模式"等.当然在重构时,有的地方没有点明使用的是那种设计模式.从今天开始,我们就围绕着设计模式这个主题来讨论一下我们常用的设计模式,当然"GoF"的23种设计模式不会全部涉及到,会介绍一些常见的设计模式.在接下来我们要分享的设计模式这个系列博客中,还是以Swi

乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabcd 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. Me

策略模式(Strategy Pattern) 详解

策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法, 重新设定接口的行为. 提供行为的调用的方法(如perform), 需要调用接口(interface)的固有方法(fly & quack)即可. 代码: package strategy; public abstract class Duck

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述         在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语

【设计模式】—— 策略模式Strategy

模式意图 定义一系列的算法,把他们封装起来,使得算法独立于适用对象. 比如,一个系统有很多的排序算法,但是使用哪个排序算法是客户对象的自有.因此把每一个排序当做一个策略对象,客户调用哪个对象,就使用对应的策略方法. 应用场景 1 当许多的类,仅仅是行为或者策略不同时,可以把行为或策略单独提取出来,这样主体的类就可以进行统一了. 2 需要使用不同的算法. 3 一个类定义了多种行为. 模式结构 Context 环境角色的,策略的调用者 class Context{ private Strategy

学习php设计模式 php实现策略模式(strategy)_php技巧

一.意图定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.策略模式可以使算法可独立于使用它的客户而变化 策略模式变化的是算法二.策略模式结构图   三.策略模式中主要角色 抽象策略(Strategy)角色:定义所有支持的算法的公共接口.通常是以一个接口或抽象来实现.Context使用这个接口来调用其ConcreteStrategy定义的算法 具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法 环境(Context)角色:持有一个Strategy类的

策略模式 Strategy

Strategy策略模式是属于设计模式中对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. 作用: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 解析: 简而言之一句话,Strategy模式是对算法的封装.处理一个问题的时候可能有多种算法,这些算法的接口(输入参数,输出参数等)都是一致的,那么可以考虑采用Strategy模式对这些算法进行封装,在基类中定义一个函数接口就可以了.

设计模式之策略模式

设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 策略模式 Strategy Pattern 定义一组算法,将每个算法都封装起来,并且使他们之间可以互换 通用类图 组成 封装角色 Context 也叫做上下文角色,起承上启下封装左右,屏蔽高层模块对策略 .算法的直接访问,封装可能存在的变化 抽象策略角色 Strategy 策略.算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性 具体策略角色

Head First设计模式之策略模式

这是学习的第一个设计模式,而书中写的实例相对比较复杂,参考了网上的文章进行总结 一.定义   策略模式(strategy pattern): 定义了算法族, 分别封闭起来, 让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户.   策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 设计原则一 找出应用中需要变化之处,把它们独立出来.不要和那些不需要变化的代码混在一起 设计原则二 针对接口