Delphi Command模式

这个例子还是比较好理解的, 所以只给出代码.
unit pattern;
interface
uses Dialogs;
type
  TAudioPlayer = class;
  TCommand = class
  public
    procedure execute; virtual; abstract;
  end;
  TPlayCommand = class(TCommand)
  private
    AudioPlayer: TAudioPlayer;
  public
    procedure execute; override;
    procedure Playcommand(AP: TAudioPlayer);
  end;
  TStopCommand = class(TCommand)
  private
    AudioPlayer: TAudioPlayer;
  public
    procedure execute; override;
    procedure StopComman(AP: TAudioPlayer);
  end;
  TRewindCommand = class(TCommand)
  private
    AudioPlayer: TAudioPlayer;
  public
    procedure execute; override;
    procedure RewindCommand(AP: TAudioPlayer);
  end;
  TKeyPad = class
  private
    PlayCommand: TCommand;
    StopCommand: TCommand;
    RewindCommand: TCommand;
  public
    constructor Create(PlayC, StopC, RewindC: TCommand); virtual;
    procedure play();
    procedure stop();
    procedure rewind();
  end;
  TAudioPlayer = class
  public
    procedure play();
    procedure stop();
    procedure rewind();
  end;
  TClient = class
  private
    KeyPad: TKeyPad;
    AudioPlayer: TAudioPlayer;
  public
    constructor Create();
    procedure test();
  end;
implementation
{ TKeyPad }
constructor TKeyPad.Create(PlayC, StopC, RewindC: TCommand);
begin
  PlayCommand := PlayC;
  StopCommand := StopC;
  RewindCommand := RewindC;
end;
procedure TKeyPad.play;
begin
  PlayCommand.execute;
end;
procedure TKeyPad.rewind;
begin
  RewindCommand.execute;
end;
procedure TKeyPad.stop;
begin
  StopCommand.execute;
end;
{ TAudioPlayer }
procedure TAudioPlayer.play;
begin
  ShowMessage(´play´);
end;
procedure TAudioPlayer.rewind;
begin
  ShowMessage(´rewind´);
end;
procedure TAudioPlayer.stop;
begin
  ShowMessage(´stop´);
end;
{ TPlayCommand }
procedure TPlayCommand.execute;
begin
  inherited;
  AudioPlayer.play();
end;
procedure TPlayCommand.Playcommand(AP: TAudioPlayer);
begin
  self.AudioPlayer := AP;
end;
{ TRewindCommand }
procedure TRewindCommand.execute;
begin
  inherited;
  AudioPlayer.Rewind;
end;
procedure TRewindCommand.RewindCommand(AP: TAudioPlayer);
begin
  AudioPlayer := ap;
end;
{ TStopCommand }
procedure TStopCommand.execute;
begin
  inherited;
  AudioPlayer.Stop;
end;
procedure TStopCommand.StopComman(AP: TAudioPlayer);
begin
  AudioPlayer := ap;
end;
{ TClient }
constructor TClient.Create;
begin
  AudioPlayer := TAudioPlayer.Create();
end;
procedure TClient.test;
var
  PlayCommand: TCommand;
  StopCommand: TCommand;
  RewindCommand: TCommand;
begin
  PlayCommand := TPlayCommand.Create;
  StopCommand := TStopCommand.Create;
  RewindCommand := TRewindCommand.Create;
  KeyPad := TKeyPad.Create(PlayCommand, StopCommand, RewindCommand);
  KeyPad.stop;
  KeyPad.play;
  KeyPad.rewind;
  KeyPad.Stop;
end;
end.

(0)

相关推荐

  • 获取Repeter的Item和ItemIndex/CommandArgument实现思路与代码

    首先看看效果: Repeater控件,放在ItemTemplate内的铵钮OnClick之后,获取Repeater的Item,ItemIndex,CommandArgument,CommandName以及绑定的字段值. 准备数据: 复制代码 代码如下: View Code Imports Microsoft.VisualBasic Namespace Insus.NET Public Class Catalog Private _ID As Integer Private _Name As St

  • php设计模式 Command(命令模式)

    <?php /** * 命令模式 * * 将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作 */ interface Command { public function execute(); } class Invoker { private $_command = array(); public function setCommand($command) { $this->_command[] = $command; } publ

  • ASP基础知识Command对象讲解

    Coonamd 对象定义了将对数据源执行的命令,可以用于查询数据库表并返回一个记录集,也可以用于对数据库表进行添加.更改和删除操作. 一.使用Command 对象的步骤: 当在 ASP 页面中使用 Command 对象处理数据时,应首先设置命令类型.命令文本以及相关的活动数据库连接等,并通过 Parameter 对象传递命令参数,然后通过调用 Execute 方法来执行 SQL 语句或调用存储过程,以完成数据库记录的检索.添加.更改和删除任务.其步骤如下: 1.使用 ActiveCommand

  • 使用Jmail及Winwebmail发信时系统记录中的错误:502 Error: command ...

    详细的错误信息如下: 发送邮件出错:发件人webmaster@58vip.com 收件人:webmaster@58vip.com信息:The message was undeliverable. All servers failed to receive the message ClientLogging enabled: Client Remote Address: 219.150.228.130 .execute() { Trying server mail:smtp.58vip.com <

  • pip 错误unused-command-line-argument-hard-error-in-future解决办法

    在我的Mac Air上,用pip安装一些Python库时,偶尔就会遇到一些报错,关于"unused-command-line-argument-hard-error-in-future",错误如下: 复制代码 代码如下: cc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -arch i386 -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -mno-fused-

  • document.execCommand()的用法小结

    首先要说明的是在firefox下支持不好.2D-Position 允许通过拖曳移动绝对定位的对象. AbsolutePosition 设定元素的 position 属性为"absolute"(绝对). BackColor 设置或获取当前选中区的背景颜色. BlockDirLTR 目前尚未支持. BlockDirRTL 目前尚未支持. Bold 切换当前选中区的粗体显示与否. BrowseMode 目前尚未支持. Copy 将当前选中区复制到剪贴板. CreateBookmark 创建一

  • 用Command对象和RecordSet对象向数据库增加记录哪一个更好

    用Command对象和RecordSet对象向数据库增加记录哪一个更好?请问应该选择哪一个? Command是用来做参数传递的,尤其是批量参数传递.Command对象主要是向SQL语句.StoredProcude传递参数,依靠SQL的强大功能来完成数据库的操作:而RecordSet对象,我们可以看作是封装了数据对象,并提供了一系列的方法和属性来简化数据库的编程. 我们通过下面用两种方法向数据库中增加一条记录的演示,可以看出,这两个对象在处理一些问题上所用的不同的方法:RecordSet对象似乎更

  • 在RowCommand事件中获取索引值示例代码

    在RowCommand事件中获取索引值 1.利用e.CommandSource 复制代码 代码如下: protected void lpg_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "ItemCollect") { GridViewRow gvr = (GridViewRow)(((LinkButton)(e.CommandSource)).NamingContainer);

  • C#命令模式(Command Pattern)实例教程

    本文以实例形式讲述了C#命令模式的实现方法,分享给大家供大家参考.具体实现方法如下: 现假设想让遥控器控制电灯的开关.电视机的开关和切换,该如何做? 所有的开.关.切换都是遥控器发出的指令,把这些指令统一抽象成一个接口. public interface IControl { void Execute(); } 把电灯.电视机抽象成类. public class Tv { public void TurnOn() { Console.WriteLine("电视机打开了"); } pub

  • asp.net gridview的Rowcommand命令中获取行索引的方法总结

    一.通过命令源获取当前行索引. 方法比较多, GridView 的 Command 事件中无法象 DataGrid 那样直接获取行, 法1, GridViewRow drv = ((GridViewRow)(((Button)(e.CommandSource)).Parent.Parent));//CommandSource 引起事件的命令源,(疑问,根据MSDN说的是GridView,如果这样的话这样操作是错误的,但我得到的确实正确的,那说明得到的是BUtton控件,等待以后查证). drv.

  • asp中command的在单条记录时,有些字段显示为空的问题

    edit_rs_cmd.CommandText = "SELECT * FROM dbo.usertable WHERE id = ?" 这时候要把不能显示的字段,在放到sql中,显示出来 edit_rs_cmd.CommandText = "SELECT *,[不能显示的字段],[不能显示的字段], FROM dbo.usertable WHERE id = ?" 后来又找到的方法 edit_rs.Fields.Item("opentime")

  • bash scp command not found的解决方法

    安装了centos6.0,由于选择了最小安装,很多包没有安装,因此一些常用的命令也不支持,如下:# scp -bash: scp: command not found 我的解决方法是:在一台运行正常的CentOS 5.6服务器上找到scp所在的包:##---以下命令在运行正常的CentOS 5.6上执行 复制代码 代码如下: # which scp /usr/bin/scp # rpm -qf /usr/bin/scp openssh-clients-4.3p2-72.el5 这么看来scp所在

  • 解决VS2012 Express的There was a problem sending the command to the program问题

    问题现象 安装Visual Studio 2012 Express之后,双击打开web.config文件时经常出现"There was a problem sending the command to the program"的错误,然后VS2012 Express打开了,但web.config文件没打开,需要再次双击web.config文件才能打开.很是烦人. 出现条件 问题出现在双击web.config文件时第一次启动VS2012 Express,如果VS2012 Express已

  • javascript document.execCommand() 常用解析

    2D-Position 允许通过拖曳移动绝对定位的对象. AbsolutePosition 设定元素的 position 属性为"absolute"(绝对). BackColor 设置或获取当前选中区的背景颜色. BlockDirLTR 目前尚未支持. BlockDirRTL 目前尚未支持. Bold 切换当前选中区的粗体显示与否. BrowseMode 目前尚未支持. Copy 将当前选中区复制到剪贴板. CreateBookmark 创建一个书签锚或获取当前选中区或插入点的书签锚的

  • ON_COMMAND_RANGE多个按钮响应一个函数的解决方法

    本文描述了ON_COMMAND_RANGE多个按钮响应一个函数的解决方法. 开发人员需要注意在自定义消息响应函数的声明过程中,一定要注意参数的形式,稍微一疏忽就会导致莫须有的错误,具体以ON_COMMAND_RANGE为例说下. 1.声明消息响应函数:在要添加的工程上添加函数afx_msg void OnButtonPort(); 2.消息映射: BEGIN_MESSAGE_MAP(CXXXDlg, CDialog) //{{AFX_MSG_MAP(CXXXDlg) ON_WM_SYSCOMMA

  • GridView中动态设置CommandField是否可用或可见的小例子

    复制代码 代码如下: protected void gvMaterial_RowDataBound(object sender, GridViewRowEventArgs e)        {            if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)            {                e.Row.Cells[0].Vis

随机推荐