{
策略模式 :用来封装算法,处理各种变法,而简单工厂模式,则是解决创建对象的问题
策略(Strategy)模式的用意是定义一组算法(algorithms),并将每个算法封装到具有共同接口的独立的类中,
从而使它们可以相互替换。
策 略模式让算法变化独立于使用它的客户端
使用情景,商场促销,进行商品打折,应用不同的算法,故采用策略模式。
1。一个抽取类
2。各种算法的子类
3。Content,配置类,维护对TCash 类对象的引用
4。结合简单工厂模拟,降低和客户端驱动的耦合
}
unit Strategy;
interface
uses classes, SysUtils;
type
TCash = class
protected
function GetCash(money: double): double; virtual;abstract;
end;
{正常收费}
TCashNormal = class(TCash)
public
function GetCash(money: double): double; override;
constructor create;
end;
{打折收费}
TCashReBate = class(TCash)
private
FCashReBete: double;
public
function GetCash(money: double): double; override;
constructor create(CashReBate: double);
end;
{返利收费}
TCashReturn = class(TCash)
private
FMoneyContion, FMoneyReturn: Double;
public
function GetCash(Money: double): double; override;
constructor create(MoneyContion, MoneyReturn: Double);
end;
{策略模式Content}
TContent = class
private
cash: TCash;
public
constructor create(s: string);
function GetCashValue(Money: double): double;
end;
var
CashContent:TContent;
implementation
{ TCashNormal }
constructor TCashNormal.create;
begin
end;
function TCashNormal.GetCash(money: double): double;
begin
result := Money;
end;
{ TCashReBate }
constructor TCashReBate.create(CashReBate: double);
begin
FCashReBete := CashReBate;
end;
function TCashReBate.GetCash(money: double): double;
begin
result := Money * FCashReBete;
end;
{ TCashReturn }
constructor TCashReturn.create(MoneyContion, MoneyReturn: Double);
begin
FMoneyContion := MoneyContion;
FMoneyReturn := MoneyReturn;
end;
function TCashReturn.GetCash(Money: double): double;
begin
result := 0;
if FMoneyContion = 0 then Exit;
result := (Money / FMoneyContion) * FMoneyReturn;
end;
{ TContent }
constructor TContent.create(s: string);
begin
if s = '正常收费' then
cash := TCashNormal.create
else if s = '满300返100' then
cash:= TCashReturn.create(300, 100)
else if s = '打八折' then
cash:= TCashReBate.create(0.8);
end;
function TContent.GetCashValue(Money: double): double;
begin
if Cash = nil then raise Exception.Create('Cash is nil ,Create Cash Object is Fail!');
result := Cash.GetCash(Money);
end;
end.
{使用}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
edt_Price: TEdit;
edt_Qulity: TEdit;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
Total: double;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Strategy;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
{采用策略模式,只需创建一个TConten对象 }
CashContent := TContent.create(ComboBox1.Text);
Total := Total + CashContent.GetCashValue(strtofloatDef(edt_Price.Text, 0) * strtoIntDef(edt_Qulity.Text, 0));
Memo1.Lines.Add(Format('type:%s, price:%f,qulity:%d,total:%f',
[
ComboBox1.Text,
strtofloatDef(edt_Price.Text, 0),
strtoIntDef(edt_Qulity.Text, 0),
Total]));
Label4.Caption := Format('总价:%f', [Total]);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
edt_Price.Text := '0';
edt_Qulity.Text := '0';
end;
end.
{窗体文件}
object Form1: TForm1
Left = 644
Top = 233
Width = 408
Height = 361
Caption = '商场收费系统 '
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 32
Top = 32
Width = 36
Height = 13
Caption = '价格:'
end
object Label2: TLabel
Left = 32
Top = 72
Width = 36
Height = 13
Caption = '数量:'
end
object Label3: TLabel
Left = 32
Top = 128
Width = 36
Height = 13
Caption = '显示:'
end
object Label4: TLabel
Left = 16
Top = 248
Width = 337
Height = 37
AutoSize = False
Caption = '总价:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -32
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Label5: TLabel
Left = 32
Top = 99
Width = 68
Height = 13
Caption = '打折类型:'
end
object edt_Price: TEdit
Left = 88
Top = 32
Width = 145
Height = 21
TabOrder = 0
end
object edt_Qulity: TEdit
Left = 88
Top = 64
Width = 145
Height = 21
TabOrder = 1
end
object Button1: TButton
Left = 248
Top = 32
Width = 75
Height = 25
Caption = '计算'
TabOrder = 2
OnClick = Button1Click
end
object Button2: TButton
Left = 248
Top = 64
Width = 75
Height = 25
Caption = '重置'
TabOrder = 3
OnClick = Button2Click
end
object Memo1: TMemo
Left = 80
Top = 128
Width = 265
Height = 97
TabOrder = 4
end
object ComboBox1: TComboBox
Left = 112
Top = 96
Width = 121
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 5
Text = '正常收费'
Items.Strings = (
'正常收费'
'打八折'
'满300返100')
end
end
//C Sharp 实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OpeartionClass
{
//抽象父类
public class TOpeartion
{
private Double _NumberA = 0;
private double _NumberB = 0;
public Double NumberA
{
get { return _NumberA; }
set { _NumberA = value; }
}
public Double NumberB
{
get { return _NumberB; }
set { _NumberB = value; }
}
public virtual Double GetResult()
{
Double result = 0;
return result;
}
}
// 加法子类
public class TAdd : TOpeartion
{
public override Double GetResult()
{
Double result = 0;
result = NumberA + NumberB;
return result;
}
}
// 减法子类
public class TSub : TOpeartion
{
public override Double GetResult()
{
Double result = 0;
result = NumberA - NumberB;
return result;
}
}
// 乘法子类
public class TMul : TOpeartion
{
public override Double GetResult()
{
Double result = 0;
result = NumberA * NumberB;
return result;
}
}
// 除法子类
public class TDev : TOpeartion
{
public override double GetResult()
{
Double result = 0;
if (NumberB == 0)
throw new Exception("除数不能为零!");
result = NumberA / NumberB;
return result;
}
}
public class TFactoryCreate
{
public static TOpeartion GetOperation(string str)
{
TOpeartion opr = null;
switch (str)
{
case "+":
opr= new TAdd();
break;
case "-":
opr= new TSub();
break;
case "*":
opr = new TMul();
break;
case "/":
opr= new TDev();
break;
}
return opr;
}
}
}
//调用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpeartionClass;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TOpeartion opr;
opr = TFactoryCreate.GetOperation(textBox3.Text);
opr.NumberA = Convert.ToInt32(textBox1.Text);
opr.NumberB = Convert.ToInt32(textBox2.Text);
textBox4.Text = Convert.ToString(opr.GetResult());
}
}
}相关推荐
LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排
大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保
设计模式、用Delphi实现---->Singleton 模式
Singleton模式起源Delphi的SINGLETON模式是在SINGLETON的基础上进行了扩展。更多SINGLETON模式的资料请参阅 《设计模式84页》目的保证一个类仅有一个实例,并提供一个访问它的全局访问点,一个相对简单的应用型设计模式动机此模式最重要的是保证大量类正确的访问单个实例。尽管一台个系统可能有多台打印机,但系统只允许有且只有一个打印缓存。同样比如:一
K8s认证文件丢失的应急处理与恢复策略
本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。
Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。 1.CoffeineBeverageWithHook {《HeadFirst设计模式》之模板方法模式 } { 编译工具: Delphi7.0 } { E-Mail : xshlife@163.com } unit uCoffeineBeve
Ultralytics YOLOv8 英伟达™ Jetson®处理器部署
英伟达™(NVIDIA®)Jetson 是一系列嵌入式计算板卡,旨在为边缘设备带来加速的 AI(人工智能)计算。这些小巧而功能强大的设备围绕英伟达™(NVIDIA®)的GPU架构打造,能够直接在设备上运行复杂的人工智能算法和深度学习模型,而无需依赖云计算资源。Jetson 板卡通常用于机器人、自动驾驶汽车、工业自动化和其他需要在本地以低延迟和高效率执行人工智能推理的应用中。此外,这些板卡基于 ARM64 架构,与传统 GPU 计算设备相比运行功耗更低。英伟达™(NVIDIA®)JetPack SDK。
使用Simulink对基于GaN器件的高频电源进行建模与仿真,重点在于优化其效率
本文介绍了基于Simulink的GaN器件高频电源仿真建模方法。通过7个步骤详细讲解系统构建过程:从创建模型、设置电源、配置GaN开关网络,到添加磁性元件、负载和控制器设计,最后进行仿真分析。重点探讨了效率优化策略,包括开关频率选择、磁性元件优化、散热设计改进及控制策略调整。该教程为GaN器件在电力电子系统中的应用提供了完整的仿真流程指导,有助于设计人员验证方案并优化性能。
Delphi面向对象设计:如何构建优雅的类结构
职责明确的边界清晰的扩展方便的使用简单的维护轻松的记住:代码首先是给人读的,其次才是给机器执行的。即使是在强调性能的Delphi开发中,良好的设计也能带来长期的可维护性优势。
UE实现贴地线(SurfaceLine)效果
UnrealEngine实现贴地线效果
《大话设计模式》之 简单工厂模式 Delphi/C shap /JAVA 实现
{计算器的功能实现 实现工厂设计模式 通过面向对象的思想,进行设计,所用的编程思想为对象的三大特性:封装,继承,多态 通过实现一个简单的 计算器的功能(输入两个数,进行加,减,乘,除) 思想思路: 1.设计虚拟父类; 2.子类继承父类 3. 通过虚拟方法,进行进行重载 4.工厂类,实例化对象,采用多态 }unit uOperation;i
不会C# Winform用户界面设计?是因为没有掌握这些控件(建议收藏)
文章目录6.1 常用控件6.1.1 单选按钮(RadioButton)6.1.2 复选框(CheckBox)6.1.3 框架1. 面板控件Panel2. 分组框GroupBox3. TabControl控件6.1.4 应用实例6. 2 列表框和组合框6.2.1 列表框(ListBox)6.2.2 组合框(ComboBox )6.2.3 应用实例6.3 用户交互界面6.3.1 滚动条和进度条6.3.2 定时器6.3.3 菜单设计菜单设计概述MenuStrip和ContextMenuSt
timing window file中的S L T指什么意思
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?
设计模式---Delphi 篇
本文以“观察者”设计模式介绍 “对象--关系映射 ORM ”下面以Delphi tiOPF 框架实现原理介绍:Abstract the Visitor logicBefore we go any further, we must abstract the Visitor functionality away from the business objects so we never
YOLOv8独家原创改进:原创自研 | 创新自研CPMS注意力,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM
自研CPMS,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM
《大话设计模式》之 策略模式 Delphi实现
{ 策略模式 :用来封装算法,处理各种变法,而简单工厂模式,则是解决创建对象的问题 策略(Strategy)模式的用意是定义一组算法(algorithms),并将每个算法封装到具有共同接口的独立的类中, 从而使它们可以相互替换。 策略模式让算法变化独立于使用它的客户端 使用情景,商场促销,进行商品打折,应用不同的算法,故采用策略模式。 1。一
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
大话设计模式学习总结
C#大话设计模式学习总结 一、工厂模式 面向对象的三个特性:封装,继承和多态 1.封装 Class Operate { privatedouble _numberA; privatedouble _numberB; publicdouble NumberA { get{return_numberA;} set{_num
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
架构师成长之路
想要成为架构师,对技术的深度和广度都有很高的要求,本文列举出成为一个架构师必备的技能和学习路线。 1. 阅读源码 说到阅读源码,可能很多同学都尝试过去阅读一些开源框架的源码,但是很难找到一个入口点;即便找到入口点,又会觉得源码中好绕,看着看着把自己都看晕了。其实,阅读源码是需要基础的。开源框架的源码中都使用了大量的设计模式,所以在阅读源码之前,我们首先要熟悉常见的设计模式 1.1...
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
Delphi模式编程之策略模式(下)
Delphi模式编程之策略模式(续) 刘 艺1.3 策略模式在酒店管理系统中的应用在酒店管理系统中,通常客房的价格不是一成不变的。对于住宿的淡季和旺季、老客户和新客户、散客和团队,都应该有不同的销售策略。显然,销售策略决定了报价。但是基于销售策略的报价体系又不能绑定于某一具体的客户端,因为只有把基于销售策略的报价体系独立出来,才能保证
Delphi五种设计模式
<br />今天抽空浏览了一下Delphi写的设计模式,网页在如下位置:<br />http://www.delphi-jedi.org/art_patterns.html<br />今天再看。仍然有种感觉。我把Observer模式的代码补充到下面。在Delphi 7已经编译通过。Lazarus应该也没有问题。<br />unit Unit2;<br />interface<br />type<br />TObservable = class;<br />TObserver = class;<br />TO
Delphi版设计模式之单例二
接上篇Delphi版设计模式之单例一,细心的朋友可能发现我在上一篇文章中重写类NewInstance和FreeInstance函数,原因是:【在delphi中编译器对构造函数的保护级别进行了处理,即便设为private,编译器仍然会将其修正为public,所以覆盖基类中的NewInstance类方法,系统在每次构造对象时都会调用这个类方法,通过重载它就可以实现对构造函数的控制】,同时在上篇文章中有一段核心代码 我以注释的形式标注这里在并发环境下存在安全隐患,那么现在我们就通过多线程的方式研究一下这个问.
Delphi版设计模式
用delphi诠释设计模式
用 Delphi 学设计模式(二) 之 工厂方法篇
“开闭原则”:一个模块应该易于扩展,免于修改 问题:请考虑上一章的例子中,如果添加一个新的具体水果类“西瓜”需要做哪些工作。 本章完成以下内容: 1、代码用支持中文的 Delphi 2005 编译并通过,并去除了其中一些无关紧要的地方,如异常处理等 ; 2、重新设计一个情景,分别用“简单工厂模式”和“工厂方法模式”两种方法实现,请体...
设计模式学习笔记5:Singleton模式及其Delphi实现
Singleton(单件)模式是一种很有用的设计模式。它的意图的是:仅仅创建一个类的实例,并提供一个访问它的全局访问点。全局变量使的一个对象易被访问,但不能防止你实例化多个对象。单件模式的目的就是确保在程序的生命周期内只有一个实例存在。多实例实现了数据的并行访问,而单例模式是把它变成串行访问。所以这模式的用途非常的广泛,如处理数据库连接的访问等等。Delphi实现Singleton也有许多方案,在
设计模式、用Delphi实现---->Decorator 模式
Decorator 模式起源Delphi的Decorator模式是在Decorator的基础上进行了扩展。更多Decorator模式的资料请参阅 《设计模式115页》目的动态地给一个对象添加一些职责。就增加功能来说,Decorator模式比增加子类更为灵活.动机我们经常要为某一些个别的对象增加一些新的职责,并不是全部的类。假设,我们有一组类用来输出文本行。
Delphi版设计模式之单例一
可能Delphi王朝真的没落了,在网上查了很久都是一些重复、陈旧、残缺不全的帖子,搞的像古代的武功秘籍一样,每次只能获取上篇或者下篇,而这些上下还有可能是残篇 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 引自菜鸟教程 从上面的话中不难看出,所谓的设计模式是针对一些常见问题总结出来的一套比较优质的解决方案,所以
设计模式、用Delphi实现---->Template Method模式
<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"
设计模式、用Delphi描述-->Visitor模式
Visitor 模式起源Delphi中的Visitor模式在基本Visitor模式进行了扩展。更多Visitor模式的资料请参 [Gam+, pages 331..344].目的表示一个作用于某个对象结构的中和元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 [Gam+, page 331].动机考虑一个面向对象的建模工具,
407



被折叠的 条评论
为什么被折叠?



