设计模式与实例代码:Strategy模式

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

定义/意图:定义一组算法并对其封装,使其可以互相替换,并根据所处上下文,使用不同的算法或业务规则

问题:对所需要算法的选择取决于发出请求的客户或要处理的数据。如果只有一些不会变化的算法,则不需要Strategy模式

解决方案:把算法的选择和算法的实现分离,允许根据上下文进行选择

参与者与协作者:Strategy基类指定不同算法的公共接口,具体Strategy实现不同的算法,上下文通过类型为Strategy的引用使用具体的Strategy实现。Context将来自客户的请求发给Strategy。

效果:可以不使用switch或条件语句,但必须以相同的方式调用所有的算法,客户需要自己选择所用具体的算法,并转给Context对象

实现:让使用算法的类(Context)包含一个抽象类(Strategy),此抽象类有一个抽象方法指定如何调用算法,每个派生类按需要实现算法。


下面是一个排序算法的示例,不同的具体的排序算法做为不同的策略,可以被用户在上下文中调用,以完成相同的排序功能。

using System;
using System.Collections.Generic;
 
namespace Strategy
{
  /// <summary>
  /// MainApp startup class for Real-World
  /// Strategy Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      // Two contexts following different strategies
      SortedList studentRecords = new SortedList();
 
      studentRecords.Add("Samual");
      studentRecords.Add("Jimmy");
      studentRecords.Add("Sandra");
      studentRecords.Add("Vivek");
      studentRecords.Add("Anna");
 
      studentRecords.SetSortStrategy(new QuickSort());
      studentRecords.Sort();
 
      studentRecords.SetSortStrategy(new ShellSort());
      studentRecords.Sort();
 
      studentRecords.SetSortStrategy(new MergeSort());
      studentRecords.Sort();
 
      // Wait for user
      Console.ReadKey();
    }
  }
 
  /// <summary>
  /// The 'Strategy' abstract class
  /// </summary>
  abstract class SortStrategy
  {
    public abstract void Sort(List<string> list);
  }
 
  /// <summary>
  /// A 'ConcreteStrategy' class
  /// </summary>
  class QuickSort : SortStrategy
  {
    public override void Sort(List<string> list)
    {
      list.Sort(); // Default is Quicksort
      Console.WriteLine("QuickSorted list ");
    }
  }
 
  /// <summary>
  /// A 'ConcreteStrategy' class
  /// </summary>
  class ShellSort : SortStrategy
  {
    public override void Sort(List<string> list)
    {
      //list.ShellSort(); not-implemented
      Console.WriteLine("ShellSorted list ");
    }
  }
 
  /// <summary>
  /// A 'ConcreteStrategy' class
  /// </summary>
  class MergeSort : SortStrategy
  {
    public override void Sort(List<string> list)
    {
      //list.MergeSort(); not-implemented
      Console.WriteLine("MergeSorted list ");
    }
  }
 
  /// <summary>
  /// The 'Context' class
  /// </summary>
  class SortedList
  {
    private List<string> _list = new List<string>();
    private SortStrategy _sortstrategy;
 
    public void SetSortStrategy(SortStrategy sortstrategy)
    {
      this._sortstrategy = sortstrategy;
    }
 
    public void Add(string name)
    {
      _list.Add(name);
    }
 
    public void Sort()
    {
      _sortstrategy.Sort(_list);
 
      // Iterate over list and display results
      foreach (string name in _list)
      {
        Console.WriteLine(" " + name);
      }
      Console.WriteLine();
    }
  }
}

在实际使用中,Strategy模式可能会增量量的数量,主要是互相替代的算法过多,这时如果使用C++的话,可以把所有具体策略的头文件包含在抽象类Strategy中,而把具体策略类的实现都放在Strategy的CPP文件中。

策略模式体现了面向对象的“对接口编辑”,“多用组合,少用继承”,“封装变化”等思想,而且遵循诸如“依赖倒置”,“开放封装”,“类型一致”等面向对象的设计原则。




策略模式类图和代码实例 NULL 博文链接:https://xuningxiaoni.iteye.com/blog/415879 立即下载

相关推荐

MATLAB实战:Gardner定时同步算法实现与BER曲线优化指南

本文详细介绍了Gardner定时同步算法在MATLAB中的实现与优化方法,重点解析了算法原理、关键步骤实现及BER曲线绘制中的常见问题解决方案。通过优化参数设置和系统架构,提升数字通信系统的符号同步性能,为QPSK、QAM等调制系统提供实用参考。

weixin_29085865的博客 231

1策略模式类图

图片来自head first 设计模式,仅供学习之用 转载于:https://www.cnblogs.com/MalcolmMeng/p/8780212.html

weixin_30662849的博客 987

深入解析Android Qcom Camera HAL3架构与Camx线程模块

本文深入解析了Android Qcom Camera HAL3架构与Camx线程模块的核心原理。文章以高通芯片平台为例,剖析了从按下快门到生成照片的完整Camera流程分析,重点阐述了Camx框架中线程池、消息队列及Fence同步机制如何协同工作,以实现高效、稳定的多线程并发图像处理,为相机性能优化提供理论基础。

weixin_29184075的博客 220

设计模式--策略模式--UML图

策略模式: http://blog.youkuaiyun.com/droyon/article/details/8611418

hailushijie的专栏 4085

手把手教你学Simulink——基于通信协议与标准的场景实例:卫星通信中的网络安全协议(IPSec)仿真

随着卫星通信在国防、金融、应急指挥、能源管网等关键领域的广泛应用,其安全性已成为系统设计的核心要求。然而,卫星链路具有广播特性、长距离传输、地面站分布广等特点,极易遭受窃听、篡改、重放、中间人攻击等网络威胁。传统的“信任链路层安全”已不足以应对现代网络攻击。为此,国际标准组织(如IETF、ETSI、CCSDS)推荐在卫星通信中部署协议,实现端到端的数据机密性、完整性、身份认证和抗重放保护。本文将手把手教你如何在中构建一个符合标准的仿真系统,涵盖从明文传输到加密隧道的完整安全链路建模。本文完整实现了。

MHD0815的博客 149

【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程【站长亲测】

MMORPG端游【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程。

百创科技 531

Java中23种设计模式详解

一、设计模式的分类   总体来说设计模式分为三大类:   创建型模式,共 5 种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。   结构型模式,共 7 种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。   行为型模式,共 11 种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、...

HERO_1990的博客 229

QT+QGIS跨平台编译(基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译)

QT+QGIS跨平台编译。 基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译。

LuckyHanMo的博客 4374

最常用的四种设计模式

下面列举四种最常用的设计模式一、Strategy模式1、两大原则Strategy模式体现了如下的两大原则:1,针对接口编程,而不是针对实现编程。2,多用组合,少用继承。2、 例子:二、Iterator模式提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。这种设计模式非常普遍,比如Java里面的:public interface Itera...

ddry47579的博客 2229

fastlio2原理详解

其核心是利用IMU的高频数据(通常100-500Hz)进行状态预测(前向传播),同时利用激光雷达扫描(通常10-100Hz)作为观测来校正状态。转换了卡尔曼增益的计算公式,将对大维度观测矩阵的求逆(点云数量级)转换为对小维度状态矩阵的求逆,从而极大提升了计算效率。:利用预测出的连续IMU状态,将一帧内每个激光点根据其时间戳反向插值,统一校正到扫描结束时刻,输出无畸变的点云。收敛后,用最终的状态将本帧点云。,根据其精确的时间戳,利用前后两个IMU位姿进行插值,计算出该点采集时刻的精确位姿,再将其全部。

Studying…… 102

allegro如何设置走线等长

设置走线等长!

weixin_42499230的博客 6928

设计模式-策略模式

设计模式-策略模式 策略模式使用的就是面向对象的继承和多态机制,非常容易理解,策略模式的三个角色分别为: Context封装角色 它也叫上下文角色,起承上启下的封装作用,屏蔽高层模块或者服务对策略、算法的直接访问,封装可能存在变化。 Strategy抽象策略角色 策略、算法家族的抽象,通常为接口,定义每个策略或方法必须具有的方法和属性。 ConcreteStrategy具体策略模式 实现抽象策略中的操作,该类含有具体的业务逻辑。 我们在看看策略模式的通用源码,先看抽象策略角色,它是非常普通的一个接口类。 p

蜗牛篆愁君 228

C# 上位机程序中的数据采集与存储技术:从采集到持久化的完整解决方案

本文系统讲解C#上位机程序如何实现设备数据采集与持久化。主要内容包括:1)多种数据采集方式(串口通信、Modbus、OPC等)及代码示例;2)详细对比不同存储技术(CSV、SQLite、关系型数据库等)的优缺点;3)提供SQLite等存储实现代码;4)推荐分层系统架构(采集-缓存-存储-可视化);5)性能优化建议(多线程采集、异步存储、批量写入等)。文章强调应根据项目需求选择合适的技术方案,构建高效稳定的数据采集存储闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1025

Android中的设计模式

总结Android框架中出现的设计模式。

陆业聪 1589

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

设计模式之命令模式(Command)摘录

设计模式之命令模式(Command)摘录!

网络资源是无限的 2736

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象。创建型模式有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些详细的类的信息封装起来。第二,它们隐藏了这些类的实例是怎样被创建和放在一起的。整个系统...

weixin_30544657的博客 77

JAVA设计模式之Strategy模式

现在需要封装一个算法,但是该算法有很多种不同的实现,比如,一个排序算法,可能有插入排序,冒泡排序,快速排序等不同的实现,而且要求这些算法由使用者来决定具体使用的是哪个算法,如何来设计呢? 这是,我们就会用到策略模式了,策略模式,就是将一个算法的不同实现封装成一个个单独的类,这些类实现同一个接口,使用者直接使用该接口来访问具体的算法。这个样子,使用者就可以使用不同的算法来实现业务逻辑了。策略模...

toulezu的专栏 152

设计模式:策略模式(Strategy)

设计模式:策略模式(Strategy)

ProgramNovice的博客 1938

设计模式详解(十):策略模式——Strategy

Strategy模式是一种行为型设计模式,它定义了一系列算法,将每种算法封装到独立的类中,使它们可以互换。使用该模式,可以在不修改客户端代码的情况下动态地改变算法的行为。Strategy模式是解决算法或行为动态切换的有效方法。它通过将算法抽象化,使得代码更加灵活、易于扩展,同时也减少了代码重复。如果你在开发过程中遇到了需要频繁修改或扩展算法的需求,不妨考虑使用Strategy模式。

Android Engineer. 1339

设计模式学习(四):Strategy策略模式

使用Strategy模式可以整体地替换算法。使用Abstract Factory模式则可以整体地替换具体工厂、零件和产品。

m0_49499183的博客 2238

设计模式_STRATEGY

期末考期间实在无聊,不想看那些本学期无聊的课程,随便应付下能过的,于是坐在图书馆,书架上抓了本《Head First: Design Pattern》 先说这确实是本好书,不愧是JOLT大奖得主,ORELLY出品,必属精品(虽然这句话是用来形容暴雪的),但书中那样趣味的写法和图示一扫我之前对设计模式的理解障碍。之前看的那些图书,你必定有一定的OO代码编写经验,而且一个个枯燥的类图,你根本无法

miracle9i的专栏 703

Strategy设计模式

在我的理解中,strategy设计模式就是能够实现整体地替换某个算法去解决同一个问题的一种编程模式。举个例子,我们从A地到B地,可以坐车,可以步行,可以骑自行车,但这三种方式都是出行的一种形式,因此,我们可以设计一个出行的接口,然后三种方法分别是接口的具体实现类。 具体结构可以概括为下面这张图: Context类可以理解为将接口封装的一个类,在使用的时候,只需要声明一个Context类,就可以委...

weixin_43846892的博客 266

设计模式之Singleton模式和Strategy模式是什么

设计模式之Singleton模式和Strategy模式是什么 Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 一个类的返回对象一个引用(并且还是同一个)和一个获得该实例的方法(通常是getInstance...

玮哥的博客 480

设计模式——Strategy(策略)设计模式

本文介绍了策略设计模式(Strategy Pattern),一种行为型设计模式,用于动态选择算法或行为。通过Spring框架的自动装配功能,实现策略的自动扫描和装配,并通过传入策略名称动态切换支付策略。文章还区分了策略模式和状态模式,从关注点、核心思想、适用场景、行为选择方式、对象设计等方面进行对比,并提供了UML图。

庄小焱 1472

设计模式之Strategy——简历篇(原创)

设计模式之Strategy——简历篇  表弟马上就要大学毕业,找工作要写简历(Resume),因此他就来问我关于这方面的问题。我告诉他最好写两种类型的简历,一种是用中文写的,一种是用英文写的,如果是国企的话,就投中文简历(ChineseResume),如果是外企的话,就投英文简历(EnglishResume),嘿嘿,原因在这里就没必要多说了吧。下面让我们看看这个过程该如何实现呢?

lxgljj的专栏 4820
上一篇: 设计模式与实例代码:Adapter模式
下一篇: 设计模式与实例代码:Decorator模式
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值