当前位置: 首页 > news >正文

极速理解设计模式系列:8.策略模式(Strategy Pattern)

四个角色:抽象策略类(Strategy)、具体策略类(ConcreteStrategy)、场景角色(Context)、客户端(Client) 

        抽象策略类(Strategy):接口提供动作让场景角色Context调用各种具体策略类的算法。

        具体策略类(ConcreteStrategy):实现各种不同的策略算法

        场景角色(Context):使用Strategy的引用实例配置场景,并且提供一个接口获取结果。

        客户端(Client) :将具体策略类代入场景角色以计算出结果

 实现思路:多个具体策略类多种方式达到目的,Context场景角色中去让客户端选择具体策略类使用。这样在客户端即可非常方便的实现多种策略得到结果。

 类图:

应用场景:某销售部门,其内部员工可以8折购买货物,大客户7.5折,小客户9折购买。

分析:根据不同的客户,选择不同的计算方法,计算出打折之后的价格。

        下面我们在控制台程序去演示一下如何使用Strategy Pattern:

        一、 抽象策略类(Strategy)

    //策略类
abstract class PriceStrategy
{
abstract public double GetPrice(double price);
}

        二、具体策略类(ConcreteStrategy)

    //具体策略(员工价格策略)
class StaffPriceStrategy : PriceStrategy
{
public override double GetPrice(double price)
{
return price * 0.8;
}
}
//具体策略(大客户价格策略)
class BigCustomerPriceStrategy : PriceStrategy
{
public override double GetPrice(double price)
{
return price * 0.75;
}
}
//具体策略(小客户价格策略)
class SmallCustomerPriceStrategy : PriceStrategy
{
public override double GetPrice(double price)
{
return price * 0.9;
}
}
//具体策略(原价策略)
class OrigPriceStrategy : PriceStrategy
{
public override double GetPrice(double price)
{
return price;
}
}

        三、场景角色(Context)

    class CalculationContext
{
PriceStrategy priceStrategy;
public void SetStrategy(PriceStrategy priceStrg)
{
priceStrategy = priceStrg;
}
public double GetTotalPrice(double price)
{
return priceStrategy.GetPrice(price);
}
}

        四、客户端(Client) 

   class Program
{
static void Main(string[] args)
{
//未打折需付款1000元
double totalPrice = 1000.0;

CalculationContext calculate = new CalculationContext();
//计算出员工打折价
calculate.SetStrategy(new StaffPriceStrategy());
double staffPrice= calculate.GetTotalPrice(totalPrice);

//计算出大客户打折价
calculate.SetStrategy(new BigCustomerPriceStrategy());
double bigCustomerPrice = calculate.GetTotalPrice(totalPrice);

//计算出小客户打折价
calculate.SetStrategy(new SmallCustomerPriceStrategy());
double smallCustomerPrice = calculate.GetTotalPrice(totalPrice);

//计算出原价
            calculate.SetStrategy(new OrigPriceStrategy());
double origPrice = calculate.GetTotalPrice(totalPrice);

Console.WriteLine(string.Format("员工打折价{0}元,大客户打折价{1}元,小客户打折价{2}元,原价{3}元",
staffPrice, bigCustomerPrice, smallCustomerPrice, origPrice));
Console.ReadLine();
}
}

        如需源码请点击 StrategyPattern.rar  下载。

相关文章:

  • Deploy Office Communications Server 2007R2 Group Chat Server(二)
  • 不怕狼一样的敌人,就怕狗一样的朋友
  • Powershell管理系列(九)删除Exchange用户邮箱中多余的电子邮件地址
  • 微距镜头
  • 《Visual Studio Hacks 》(五)
  • Android应用程序框架层和系统运行库层日志系统源代码分析
  • 次世代游戏引擎光影制作简述(转)
  • linux查看硬件信息及驱动设备相关整理
  • 烂泥:HTML编辑器中使用img插入图片
  • wcf学习总结《上》
  • Oracle exp/imp,备份或导入时注意的事项
  • IDEA常用快捷键[转]
  • ABR上配置OSPF区域间路由汇总
  • J-Scope的使用
  • oracle kill所有plsql developer进程
  • Android 控件背景颜色处理
  • npx命令介绍
  • php ci框架整合银盛支付
  • Spark学习笔记之相关记录
  • spring学习第二天
  • SQL 难点解决:记录的引用
  • Vim 折腾记
  • Vue2.x学习三:事件处理生命周期钩子
  • 分享几个不错的工具
  • 记一次删除Git记录中的大文件的过程
  • 如何使用 JavaScript 解析 URL
  • 三栏布局总结
  • 算法-插入排序
  • 项目管理碎碎念系列之一:干系人管理
  • 学习笔记TF060:图像语音结合,看图说话
  • 中文输入法与React文本输入框的问题与解决方案
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #QT(TCP网络编程-服务端)
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (2020)Java后端开发----(面试题和笔试题)
  • (3)选择元素——(17)练习(Exercises)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (笔试题)合法字符串
  • (独孤九剑)--文件系统
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (力扣)循环队列的实现与详解(C语言)
  • (四) 虚拟摄像头vivi体验
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转载)CentOS查看系统信息|CentOS查看命令