设计模式——策略模式

简介: 设计模式——策略模式

一、定义

它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。


二、特点

  1. 封装了变化
  2. 策略模式的Strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于析取出这些算法中的公共功能

三、优缺点

优点

  1. 简化了单元测试,每个算法都有自己的类,,可以通过自己的接口单独测试
  2. 减少了算法类和使用算法类之间的耦合,一个算法一个类

缺点

在基本的策略模式中,所具有具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

什么时候用

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

五、实例

策略模式

Strategy类,定义所有支持的算法的公共接口

//抽象算法类
abstract class Strategy
{
    //算法方法
    public abstract void AlgorithmInterface();
}

ConcreteStrategy类:封装了具体的算法或行为,继承于Strategy

//具体算法A
class ConcreteStrategyA:Strategy
{
  public override void AlgorithmInterface
    {
      Console.writeline("算法实现");
    }
}
//具体算法B
class ConcreteStrategyB:Strategy
{
  //算法吧B实现方法
    public override void AlgorithmInterface()
    {
      Console.WriteLine("算法B实现");
    }
 }
//具体算法C
class ConcreteStrategyC:Strategy
{
  //算法C实现方法
    public override void AlgorithmInterface()
    {
      console.writeline("算法C实现);
    }
}

Context类:用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。

class Context
{
    //初始化时,传入具体的策略对象
    Strategy strategy;
    public Context(Strategy strategy)
    { 
        this.strategy=strategy;//
    }
    //上下文接口
    public void ContextInterface()
    {
        strategy.AlgorithmInterface();
    }
}

客户端代码

static void Main(string [] args)
    //由于实例化不同的策略,所以最终在调用context.ContextInterface();时所获得的结果就不相同
    //声明Context 类型变量
    Context context;
  context= new Context(new ConcreteStrategyA());
  context.ContextInterface();
  context= new Context(new ConcreteStrategyB());
  context.ContextInterface();
  context= new Context(new ConcreteStrategyA());
  context.ContextInterface();
  Console.Read();

类图关系代码表示



六、涉及知识点

1.构造方法

对类进行初始化,

与类同名

无返回值,无void

与类同名,在new的时候使用
所有类都有构造方法,如果不编码则系统默认生成空的构造方法,若你有定义的构造方法那么默认的构造方法就会失效。

2.访问修饰符

public:公有的 表示所修饰的类成员可以允许其他任何类来访问

private:私有的 表示只能在同一个类的成员访问

3.关系

本模式中涉及到的关系

聚合:表示一种弱的拥有关系,整体和个体的关系,个体可以脱离整体单独存在

实现:成员变量,作为参数传入到整体的构造方法

图形:空心菱形+实线箭头

继承:类与类,类与接口之间的关系,。子类继承父类所有非private的方法

实现:子类继承父类用:表示

图形:空心三角形+实线

4.抽象类

用abstract关键字修饰

抽象类代表一个抽象的概念,他提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树叶节点均应是抽象类。

5.特点

  1. 抽象类不能实例化
  2. 抽象方法时必须被子类重写的
  3. 如果类中包含抽象方法,那么类必须定义为抽象类,不论是否还包含其他一般方法
  4. 一个类可以支持多个接口,一个类只能继承一个类。
目录
相关文章
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
319 35
|
3月前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
7月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
143 4
|
7月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
143 14
|
10月前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
338 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
12月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
138 1
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
181 2
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
105 2