《大话设计模式》之 策略模式 Delphi实现

delphi xe7 下实现的策略模式例子 delphi xe7 下实现的策略模式例子,适合初学者学习, 立即下载
{
  策略模式   :用来封装算法,处理各种变法,而简单工厂模式,则是解决创建对象的问题


  策略(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());


        }
    }
}

Delphi设计模式重构:策略模式替代复杂条件分支的工程实践.pdf 文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 如果你正在寻找一种高效、强大的编程语言来开发跨平台应用,那么Delphi绝对值得考虑!它拥有直观的可视化开发环境,让代码编写变得轻松简单。凭借着快速的编译速度和卓越的性能优化,Delphi能够帮助开发者迅速构建出高质量的应用程序。无论是Windows、macOS、iOS还是Android平台,Delphi都能完美支持,真正实现一次编写,多平台部署。选择Delphi,开启高效开发之旅! 立即下载

相关推荐

LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排

大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保

weixin_34335458的博客 407

设计模式、用Delphi实现---->Singleton 模式

Singleton模式起源Delphi的SINGLETON模式是在SINGLETON的基础上进行了扩展。更多SINGLETON模式的资料请参阅 《设计模式84页》目的保证一个类仅有一个实例,并提供一个访问它的全局访问点,一个相对简单的应用型设计模式动机此模式最重要的是保证大量类正确的访问单个实例。尽管一台个系统可能有多台打印机,但系统只允许有且只有一个打印缓存。同样比如:一

programlover的专栏 1176

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 327

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook

模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。 1.CoffeineBeverageWithHook {《HeadFirst设计模式》之模板方法模式 } { 编译工具: Delphi7.0 } { E-Mail : xshlife@163.com } unit uCoffeineBeve

djCode 733

Ultralytics YOLOv8 英伟达™ Jetson®处理器部署

英伟达™(NVIDIA®)Jetson 是一系列嵌入式计算板卡,旨在为边缘设备带来加速的 AI(人工智能)计算。这些小巧而功能强大的设备围绕英伟达™(NVIDIA®)的GPU架构打造,能够直接在设备上运行复杂的人工智能算法和深度学习模型,而无需依赖云计算资源。Jetson 板卡通常用于机器人、自动驾驶汽车、工业自动化和其他需要在本地以低延迟和高效率执行人工智能推理的应用中。此外,这些板卡基于 ARM64 架构,与传统 GPU 计算设备相比运行功耗更低。英伟达™(NVIDIA®)JetPack SDK。

机器人控制与仿真应用 3876

使用Simulink对基于GaN器件的高频电源进行建模与仿真,重点在于优化其效率

本文介绍了基于Simulink的GaN器件高频电源仿真建模方法。通过7个步骤详细讲解系统构建过程:从创建模型、设置电源、配置GaN开关网络,到添加磁性元件、负载和控制器设计,最后进行仿真分析。重点探讨了效率优化策略,包括开关频率选择、磁性元件优化、散热设计改进及控制策略调整。该教程为GaN器件在电力电子系统中的应用提供了完整的仿真流程指导,有助于设计人员验证方案并优化性能。

amy_mhd的博客 234

Delphi面向对象设计:如何构建优雅的类结构

职责明确的边界清晰的扩展方便的使用简单的维护轻松的记住:代码首先是给人读的,其次才是给机器执行的。即使是在强调性能的Delphi开发中,良好的设计也能带来长期的可维护性优势。

mgcps的专栏 359

UE实现贴地线(SurfaceLine)效果

UnrealEngine实现贴地线效果

专注GIS开发 4572

《大话设计模式》之 简单工厂模式 Delphi/C shap /JAVA 实现

{计算器的功能实现 实现工厂设计模式 通过面向对象的思想,进行设计,所用的编程思想为对象的三大特性:封装,继承,多态 通过实现一个简单的 计算器的功能(输入两个数,进行加,减,乘,除) 思想思路: 1.设计虚拟父类; 2.子类继承父类 3. 通过虚拟方法,进行进行重载 4.工厂类,实例化对象,采用多态 }unit uOperation;i

tjb_1216的专栏 2314

不会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

智慧空间实验室 2920

timing window file中的S L T指什么意思

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 774

设计模式---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

Mr.Kim.Wu 的日记 1367

YOLOv8独家原创改进:原创自研 | 创新自研CPMS注意力,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM

自研CPMS,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 3797

《大话设计模式》之 策略模式 Delphi实现

{  策略模式   :用来封装算法,处理各种变法,而简单工厂模式,则是解决创建对象的问题  策略(Strategy)模式的用意是定义一组算法(algorithms),并将每个算法封装到具有共同接口的独立的类中,  从而使它们可以相互替换。  策略模式让算法变化独立于使用它的客户端   使用情景,商场促销,进行商品打折,应用不同的算法,故采用策略模式。 1。一

tjb_1216的专栏 1338

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

编程之家 2465

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

架构师成长之路

想要成为架构师,对技术的深度和广度都有很高的要求,本文列举出成为一个架构师必备的技能和学习路线。 1. 阅读源码 说到阅读源码,可能很多同学都尝试过去阅读一些开源框架的源码,但是很难找到一个入口点;即便找到入口点,又会觉得源码中好绕,看着看着把自己都看晕了。其实,阅读源码是需要基础的。开源框架的源码中都使用了大量的设计模式,所以在阅读源码之前,我们首先要熟悉常见的设计模式 1.1...

John8988的博客 890

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Delphi模式编程之策略模式(下)

Delphi模式编程之策略模式(续) 刘 艺1.3                         策略模式在酒店管理系统中的应用在酒店管理系统中,通常客房的价格不是一成不变的。对于住宿的淡季和旺季、老客户和新客户、散客和团队,都应该有不同的销售策略。显然,销售策略决定了报价。但是基于销售策略的报价体系又不能绑定于某一具体的客户端,因为只有把基于销售策略的报价体系独立出来,才能保证

newdream的专栏 1443

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

astra_zhao的专栏 2352

Delphi版设计模式之单例二

​接上篇Delphi版设计模式之单例一,细心的朋友可能发现我在上一篇文章中重写类NewInstance和FreeInstance函数,原因是:【在delphi中编译器对构造函数的保护级别进行了处理,即便设为private,编译器仍然会将其修正为public,所以覆盖基类中的NewInstance类方法,系统在每次构造对象时都会调用这个类方法,通过重载它就可以实现对构造函数的控制】,同时在上篇文章中有一段核心代码 我以注释的形式标注这里在并发环境下存在安全隐患,那么现在我们就通过多线程的方式研究一下这个问.

舞动的代码 579

Delphi版设计模式

用delphi诠释设计模式

QAQ的小耗子的博客 553

用 Delphi 学设计模式(二) 之 工厂方法篇

“开闭原则”:一个模块应该易于扩展,免于修改 问题:请考虑上一章的例子中,如果添加一个新的具体水果类“西瓜”需要做哪些工作。 本章完成以下内容: 1、代码用支持中文的 Delphi 2005 编译并通过,并去除了其中一些无关紧要的地方,如异常处理等 ; 2、重新设计一个情景,分别用“简单工厂模式”和“工厂方法模式”两种方法实现,请体...

weixin_30606669的博客 174

设计模式学习笔记5:Singleton模式及其Delphi实现

Singleton(单件)模式是一种很有用的设计模式。它的意图的是:仅仅创建一个类的实例,并提供一个访问它的全局访问点。全局变量使的一个对象易被访问,但不能防止你实例化多个对象。单件模式的目的就是确保在程序的生命周期内只有一个实例存在。多实例实现了数据的并行访问,而单例模式是把它变成串行访问。所以这模式的用途非常的广泛,如处理数据库连接的访问等等。Delphi实现Singleton也有许多方案,在

每天一小步 1409

设计模式、用Delphi实现---->Decorator 模式

   Decorator 模式起源Delphi的Decorator模式是在Decorator的基础上进行了扩展。更多Decorator模式的资料请参阅 《设计模式115页》目的动态地给一个对象添加一些职责。就增加功能来说,Decorator模式比增加子类更为灵活.动机我们经常要为某一些个别的对象增加一些新的职责,并不是全部的类。假设,我们有一组类用来输出文本行。

programlover的专栏 5175

Delphi版设计模式之单例一

可能Delphi王朝真的没落了,在网上查了很久都是一些重复、陈旧、残缺不全的帖子,搞的像古代的武功秘籍一样,每次只能获取上篇或者下篇,而这些上下还有可能是残篇 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 引自菜鸟教程 从上面的话中不难看出,所谓的设计模式是针对一些常见问题总结出来的一套比较优质的解决方案,所以

舞动的代码 890

设计模式、用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"

zgqtxwd的专栏 605

设计模式、用Delphi描述-->Visitor模式

   Visitor 模式起源Delphi中的Visitor模式在基本Visitor模式进行了扩展。更多Visitor模式的资料请参 [Gam+, pages 331..344].目的表示一个作用于某个对象结构的中和元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 [Gam+, page 331].动机考虑一个面向对象的建模工具,

programlover的专栏 1127
上一篇: U盘插入拔出检测
下一篇: Delphi元件的handle的建立
easyboot
博客等级 码龄25年 533粉丝 723原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值