策略模式

文章目录

  • 策略模式
    • 模式分类
    • 模式产生的原因
    • 模式类图
    • 代码实现
    • 策略模式总结
      • 策略模式的优点:
      • 策略模式的缺点:

本篇博客将介绍策略模式,策略模式用于算法的自由切换和扩展,他是使用较为广泛的设计模式之一。基本上凡是涉及到父类和父类之间的交互都会或多或少的涉及到这个模式。策略模式提供了一种对象在面对多项选择时的解决方案。

模式分类

行为型设计模式。

模式产生的原因

在软件开发中,我们常常会遇到一种情况:实现一个功能需要用到多种算法或者途径,一种常用的方式是我们通过硬编码将所有的算法集中在一个类中,在该类中通过多个方法,每一种方法对应一个具体的算法;当然也可以将这些算法封装在一个统一的方法中,并使用分支语句来判断选择。这两种的方法都被称之为硬编码,如果增加一种新的算法此时我们就需要修改我们写好的代码,非常的不利于维护和拓展。

此时我们可以选择一种设计模式来灵活的选择算法,还能够方便的增加新的算法。该设计模式就是策略模式。可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封装算法的类都可以是一种策略,为了保证这些策略在使用时具有一致性,一般会提供一个抽象的策略类来做算法的声明,而每种算法则对应一个具体策略类。

模式类图

由上图可知,经典策略模式包括以下3个对象:

Context(环境类):

环境类是使用算法的角色,他在解决某个问题是可以采用多种策略。在环境类中维持一个对抽象策略类的引用,用于定义所采用的策略。

Strategy(抽象策略类):

抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类,他可以是抽象类或者具体类,也可以是接口。

ConcreteStrategy(具体策略类):

具体抽象类实现了在抽象策略类中声明的算法,在运行时,具体策略类对象将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务的功能。

代码实现

某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:

  1. 学生凭学生证可以享受电影票8折优惠。
  2. 年龄在10周岁及以下的儿童可享受每张票减10元的优惠。
  3. 影院VIP享受半折优惠。

请使用策略模式设计这个系统。

电影票类:

namespace Strategy.Strategy.Example
{public class MovieTicket{private Discount _discount;private int _ticketMoney;public MovieTicket(int money){_ticketMoney = money;}public void SetDiscount(string name){_discount = DisCountFactory.Create(name);}public float Calculate(){return _discount.Calculate(_ticketMoney);}}
}

抽象打折类:

namespace Strategy.Strategy.Example
{public abstract class Discount{public const string NAME = "";public abstract float Calculate(int money);}
}

打折工厂:

using System;namespace Strategy.Strategy.Example
{public static class DisCountFactory{public static Discount Create(string name){Type type = Type.GetType($"Strategy.Strategy.Example.MyDiscount.{name}");if (type == null){return null;}return Activator.CreateInstance(type) as Discount;}}
}

儿童折扣:

namespace Strategy.Strategy.Example.MyDiscount
{public class ChildDiscount : Discount{public new const string NAME = "ChildDiscount";public override float Calculate(int money){if (money >= 20){return money - 10;}return money;}}
}

学生折扣:

namespace Strategy.Strategy.Example.MyDiscount
{public class StudentDiscount : Discount{public new const string NAME = "StudentDiscount";public override float Calculate(int money){return money * 0.8f;}}
}

VIP折扣:

namespace Strategy.Strategy.Example.MyDiscount
{public class VipDiscount : Discount{public new const string NAME = "VipDiscount";public override float Calculate(int money){return money * 0.5f;}}
}

Program类:

using System;
using Strategy.Strategy.Example;
using Strategy.Strategy.Example.MyDiscount;namespace Strategy
{internal class Program{public static void Main(string[] args){MovieTicket movieTicket = new MovieTicket(30);movieTicket.SetDiscount(ChildDiscount.NAME);Console.WriteLine(movieTicket.Calculate());movieTicket.SetDiscount(StudentDiscount.NAME);Console.WriteLine(movieTicket.Calculate());movieTicket.SetDiscount(VipDiscount.NAME);Console.WriteLine(movieTicket.Calculate());}}
}

策略模式总结

策略模式的优点:

  1. 策略模式提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或者行为,也可以灵活的添加新的算法和行为。
  2. 使用策略模式可以避免多重条件选择语句。
  3. 策略模式可以让被选择的算法可以得到复用。

策略模式的缺点:

  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类,可以通过引入策略代理来解决这个问题。
  2. 策略模式将造成系统产生很多具体策略类。

C#设计模式之策略模式相关推荐

  1. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  2. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

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

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  5. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  6. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  7. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  8. 面向对象设计模式之策略模式

    面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...

  9. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  10. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. java web 监听器 例子_Java web技术应用---监听器
  2. Dependency injection in ASP.NET Core
  3. JavaScript 技术篇-js语句创建dom节点,并给节点设置属性
  4. Oracle EM 配置常用命令
  5. 【数据结构总结】第四章:串、数组和广义表(线性结构)
  6. P4428-[BJOI2018]二进制【树状数组,set】
  7. c语言递归算法兔子问题,Java递归算法经典实例(经典兔子问题)
  8. PDF Suite Pro(PDF全能工具箱电脑版)官方正式版V19.0.22 | 含ocr文字识别软件 | pdf全能工具箱怎么样?
  9. c语言毕业论文,关于c语言的毕业论文题目[word文档]
  10. 我的理想计算机作文300字,我的理想作文300字(通用20篇)
  11. APUE-文件和目录(六)函数ftw和nftw
  12. 拉文大学计算机科学,美国研究生语言双录取,这些大学有你中意的吗?
  13. pvr.ccz 与 png 格式 互转的解决方案
  14. java 订单模块实现
  15. javascript-鄙人常用的功能函数
  16. 手把手教你线程池配合CompletableFuture实现图片下载并压缩
  17. python读书心得体会范文_读书心得体会范文10篇完美版
  18. 2018南京大学计算机系夏令营上机考试(一)
  19. 数据库中LIMIT和 OFFSET的理解
  20. vite 设置启动Network 为本地ip

热门文章

  1. python成语游戏代码_Python基础,猜成语小游戏
  2. 近红外光学成像(fNIRS)介绍
  3. C#创建及读取DAT文件案例
  4. 快速集成 iMessage (上)
  5. 一枚亲斤手对中大SYSUMSClub的puzzle的解题记录(writeup)(2021-10)(G2T1me)
  6. I love 114514(模拟)
  7. 漂亮的eclipse深色配色方案
  8. 没有投屏标志怎么投屏_腾讯视频没有投屏标志
  9. 在Windows操作系统中怎样使用nc命令
  10. 计算机在家电中的用途,计算机技术在信家电中的运用11.doc