设计模式——策略模式

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

一、定义

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


二、特点

  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. 一个类可以支持多个接口,一个类只能继承一个类。
目录
相关文章
|
3月前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
6天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
23 1
|
9天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
18 2
|
23天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
32 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
29 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
64 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
27 3
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
31 1
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
30 2