设计模式-策略模式

news/发布时间2024/5/14 17:19:33

设计模式-策略模式

先使用简单工厂设计一个商场收银软件

现金收费抽象类

abstract class CashSuper
{public abstract double acceptCash(double money);//现金收取超类的抽象方法,收取现金,参数为原价,返回为当前价
}

正常收费子类

class CashNormal:CashSuper
{public override double acceptCash(double money){return money;}
}

打折收费子类

class CashRebate:CashSuper
{private double moneyRebate = 1d;public CashRebate(string moneyRebate){this.moneyRebate = double.Parse(moneyRebate);        }public override double acceptCash(double money){return money*moneyRebate;}
}

返利收费子类

class CashReturn:CashSuper
{private double moneyCondition = 0.0d;private double moneyReturn = 0.0d;public CashReturn(string moneyCondition,string moneyReturn){this.moneyCondition = double.Parse(moneyCondition);this.moneyReturn = double.Parse(moneyReturn);}public override double acceptCash(double money){double result = money;if(money >= moneyCondition)result = money - Math.Floor(money/moneyCondition) * moneyReturn;return result}
}

现金收费工厂类

class CashFactory{public static CashSuper createCashAccept(string type){CashSuper cs = null;switch(type){case "正常收费";cs = new CashNormal();break;case "满300返100";cs = new CashReturn("300","100");break;    case "打8折";cs = new CashRebate("0.8");break;                }return cs;}
}

客户端窗体程序(主要部分)

double total = 0.0d;
private void btnOK_Click(object sender,EventArgs e){CashSuper csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());//要收的费用超类体现了多态double totalPrices = 0d;totalPrices = csuper.acceptCash(Convert.ToDouble(txtPrice.Text)*Convert.ToDouble(txtNum.txt));//单价x数量是原价total = total + totalPrices;
}

简单工厂的缺点

增加 需要打5折或者满500送200的促销活动时候,需要在生成工厂添加两个条件。
增加 满100积分10点,需要加一个积分算法,构造方法有两个参数:条件和返点,让它继承CashSuper,再增加分支条件。

简单工厂模式虽然能解决这个问题,但这个模式只是解决对象的创建问题,而且由于工厂本身包括了所有的收费方式,商场是可能经常性地更改打折额度和返利额度,每次维护或扩展收费方式都要改动这个工厂,以致代码需要重新编译部署,所以用它不是最好地办法

策略模式

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

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

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

//具体算法A
class ConcreteStategyA:Strategy{//算法A实现方法public override void AlgorithmInterface(){Console.WriteLine("算法A实现")}
}
//具体算法B
class ConcreteStategyB:Strategy{//算法B实现方法public override void AlgorithmInterface(){Console.WriteLine("算法B实现")}
}
//具体算法C
class ConcreteStategyC: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 context;context = new Context(new ConcreteStrategyA());context.ContextInterface();context = new Context(new ConcreteStrategyB());context.ContextInterface();context = new Context(new ConcreteStrategyC());context.ContextInterface();
}

策略模式实现商场收银

CashContext类(与简单工厂结合)
class CashContext
{CashSuper cs = null;public CashContext(string type){switch(type){case "正常收费";cs = new CashNormal();break;case "满300返100";cs = new CashReturn("300","100");break;    case "打8折";cs = new CashRebate("0.8");break;                }     }public double GetResult(double money){return cs.acceptCash(money);}
}
客户端主要代码
double total = 0.0d;
private void btnOK_Click(object sender,EventArgs e){CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());double totalPrices = 0d;totalPrices = csuper.GetResult(Convert.ToDouble(txtPrice.Text)*Convert.ToDouble(txtNum.txt));//单价x数量是原价total = total + totalPrices;
}

两种设计模式总结

//简单工厂模式的用法CashSuper csuper = CashFactory.createCashAccept(...);...=csuper.acceptCash(...);
//策略模式与简单工厂结合的用法
CashContext csuper = new Cashcontext(...);
...=csuper.GetResult(...);

简单工厂模式需要让客户端认识两个类,CashSuper和CashFactory,而策略模式与简单工厂结合的用法,客户端只需要认识一个类CashContext就可以,耦合更加降低!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/BFHU/2057.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Jmeter接口测试+压力测试

Jmeter-http接口脚本 一般分五个步骤:(1)添加线程组 (2)添加http请求 (3)在http请求中写入接入url、路径、请求方式和参数 (4)添加查看结果树 (5)调用接口、…

【ChatIE】论文解读:Zero-Shot Information Extraction via Chatting with ChatGPT

文章目录 介绍ChatIEEntity-Relation Triple Extration (RE)Named Entity Recognition (NER)Event Extraction (EE) 实验结果结论 论文:Zero-Shot Information Extraction via Chatting with ChatGPT 作者:Xiang Wei, Xingyu Cui, Ning Cheng, Xiaobin W…

MySQL-----多表操作

介绍 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。 一 多…

深入解析SDRAM:从工作原理到实际应用

深入解析SDRAM:从工作原理到实际应用 在众多内存技术中,同步动态随机访问存储器(SDRAM)因其出色的性能和广泛的应用而备受关注。本文将从SDRAM的工作原理入手,探讨其性能优化策略和在现代电子设备中的应用。 SDRAM工作…

linux上安装bluesky的步骤

1、设备上安装的操作系统如下: orangepiorangepi5b:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy 2、在用户家目录下创建一个目录miniconda3目录&a…

MATLAB 导出可编辑的eps格式图像

任务描述:部分期刊要求提交可编辑的eps格式图像,方便美工编辑对图像进行美化 我试了直接print或者在figure窗口导出,发现导出的文件放到Adobe AI中并不能编辑,经Google找到解决办法: %EPS exportgraphics(gcf,myVect…

【书生·浦语大模型实战营】第6节:OpenCompass 大模型评测(笔记版)

OpenCompass 大模型评测 1.关于评测的三个问题 为什么需要评测:模型选型、能力提升、应用场景效果测评。测什么:知识、推理、语言;长文本、智能体、多轮对话、情感、认知、价值观。怎样测:自动化客观测评、人机交互测评、基于大…

Day31文件IO

文章目录 1.什么是文件IO1.1 概念1.2 特点1.3 操作 2.函数接口2.1 打开文件 open()2.2 关闭文件2.3 读写文件2.3.1 读文件2.3.2 写文件 2.4 文件的定位操作 标准IO和文件IO总结 1.什么是文件IO 1.1 概念 又称系统IO,是系统调用,是操作系统提供的接口函…

【漏洞复现】大华智慧园区综合管理平台信息泄露漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台,具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配,满足多元化的管理需求,同时通过提供智能服务,增强使用体验。 Nx02 漏洞描述 大华智慧园区…

typescript 索引签名类型

ts索引类型简介 在TypeScript中,索引签名类型(Index Signature Type)是一种特殊的类型,它定义了对象中键的类型以及相应的值的类型。通过使用索引签名类型,我们可以表示一个对象,该对象的键可以是任意类型…

数据结构--红黑树详解

什么是红黑树 红黑树(Red Black Tree)是一种自平衡二叉查找树。它是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 由于其自平衡的特性,保证…

记一次 .NET某列控连锁系统 崩溃分析

一:背景 1. 讲故事 过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧。 去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自…

【regex】正则表达式

集合 [0-9.] [0-9.\-] 例子 正则表达式,按照规则写,写的时候应该不算困难,但是可读性差 不同语言中regex会有微小的差异 vim 需要转义, perl/python中不需要转义 锚位 \b am\b i am 命名 / 命名捕获组 ( 捕获组(…

Commonjs 和 Es Module详解

一 前言 今天我们来深度分析一下 Commonjs 和 Es Module,希望通过本文的学习,能够让大家彻底明白 Commonjs 和 Es Module 原理,能够一次性搞定面试中遇到的大部分有关 Commonjs 和 Es Module 的问题。 带上疑问开始今天的分析: …

PyTorch深度学习实战(37)——CycleGAN详解与实现

PyTorch深度学习实战(37)——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN),可以在不需要配…

《深入浅出 Spring Boot 3.x》预计3月份发版

各位,目前本来新书《深入浅出 Spring Boot 3.x》已经到了最后编辑排版阶段,即将在3月份发布。 目录: 现在把目录截取给大家: 主要内容: 本书内容安排如下。 ● 第 1 章和第 2 章讲解 Spring Boot 和传统 Spri…

stm32——hal库学习笔记(定时器)

这里写目录标题 一、定时器概述(了解)1.1,软件定时原理1.2,定时器定时原理1.3,STM32定时器分类1.4,STM32定时器特性表1.5,STM32基本、通用、高级定时器的功能整体区别 二、基本定时器&#xff0…

找不到android.support.v4.app.Fragment的类文件

问题 android.support.v4.app.Fragment的类文件 详细问题 笔者Android项目开发集成QQ登录 控制台报错 D:\AndroidProjects\assistingAgriculture\app\src\main\java\com\example\assistingagriculture\activity\normal_mode\QQLoginActivity.java:43: 错误: 无法访问Fragme…

k-邻近算法(kNN)

目录 k-近邻算法概述 k-近邻算法的一般流程 kNN算法伪代码 k-近邻算法概述 优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高、空间复杂度高 适用数据范围:数值型和标称型 k-近邻算法的一般流程 (1&#x…

【小呆的力学笔记】弹塑性力学的初步认知五:初始屈服条件(1)

文章目录 3. 初始屈服条件3.1 两个假设以及屈服条件基本形式3.2 π \pi π平面、Lode参数3.3 屈服曲线的一般特征 3. 初始屈服条件 3.1 两个假设以及屈服条件基本形式 在简单拉伸时,材料的屈服很明确,即 σ > σ s (1) \sigma\gt\sigma_s\tag{1} …
推荐文章