command模式例子(DELPHI版)(0分)

  • 主题发起人 主题发起人 billy_yuan
  • 开始时间 开始时间
B

billy_yuan

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TGo = class(TObject)
Name:String ;
procedure goBefore ;
virtual ;
procedure going ;
virtual ;
procedure goAfter ;virtual ;
function go():String ;
end ;
TGoSchool =class(TGo)
procedure goBefore ;override ;
procedure goAfter ;
override ;
procedure going ;
override ;
end ;
TGoMarket =class(TGo)
procedure goBefore ;override ;
procedure goAfter ;override ;
procedure going ;
override ;
end ;
TGoOffice =class(TGo)
procedure goBefore ;override ;
procedure goAfter ;override ;
procedure going ;override ;
end ;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
function TGo.go: String;
begin
gobefore ;
going ;
goafter ;
end;

procedure TGo.goAfter;
begin

end;

procedure TGo.goBefore;
begin

end;

procedure TGo.going;
begin

end;

procedure TGoSchool.goAfter;
begin
Application.MessageBox('我到了学校,开始上课!!',pchar(self.name),0) ;
end;

procedure TGoSchool.goBefore;
begin
Application.MessageBox('我要记得带作业!',pchar(self.name),0) ;
end;

procedure TGoSchool.going;
begin
Application.MessageBox('路上的MM可真多啊,要是爸爸在就好了!',pchar(self.name),0) ;
end;

procedure TGoMarket.goAfter;
begin
Application.MessageBox('今天买的东西可就真多啊,真重!',pchar(self.name),0) ;
end;

procedure TGoMarket.goBefore;
begin
Application.MessageBox('今天记得要买什么东西?对了,今天要去家乐福',pchar(self.name),0) ;
end;

procedure TGoMarket.going;
begin
Application.MessageBox('车上真挤,那个臭男人怎么老是盯着我看!',pchar(self.name),0) ;
end;

procedure TgoOffice.goAfter;
begin
Application.MessageBox('到公司了,开始上班!',pchar(self.name),0) ;
end;

procedure TgoOffice.goBefore;
begin
Application.MessageBox('小丽正等着我呢!',pchar(self.name),0) ;//小丽乃秘书也
end;

procedure TgoOffice.going;
begin
Application.MessageBox('路上的MM可真多啊,要是儿子在就好了!',pchar(self.name),0) ;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
son:TGoSchool ;
mother:TGoMarket ;
dady:TGoOffice ;
family:TStringlist ;
i:integer ;
begin
son := TGoSchool.Create ;
son.Name := '儿子' ;
mother := TGoMarket.Create ;
mother.Name := '妈妈';
dady := TGoOffice.Create ;
dady.Name := '爸爸';
family := TStringlist.Create ;
family.AddObject('1',son) ;
family.AddObject('2',mother) ;
family.AddObject('3',dady) ;
for i:=0 to family.Count-1do
begin
TGo(family.Objects).go ;
end ;
end;
end.
这是我自己编写的一个例子。
 
麻烦楼主在写例子前,能不能先说明一下这个模式的原理、作用、优缺点等等东西
这样对我这样不太了解设计模式的人,可能比较好理解一些
 
不错不错,值得鼓励!!楼主加油呀!再来点其他有趣的[:D]
 
对,值得鼓励!楼主加油,再接再厉!
 
go 接口.gobefore,going,goafter 实现.是这样理解吗?
 
command模式的作用是把处理过程封装成对象,好处在于,这样可以对各种处理动作进行诸如指定参数、排列、执行、取消、日志记录、事务支持等等。比如玩过SIMS(模拟人生)的革命同志都知道,在游戏中你可以给不同的角色提出一系列的操作,如你让“dady”去GoSchool,再TGoMarket,再GoOffice,那么“dady”下面就会出现一个队伍的列表,你可以在中间插入、修改或删除。这里的一个一个的指令就可以用command模式来实现。好处是
1调用操作的对象和具体操作的对象解耦,这里调用操作的对象是SIMS的游戏系统,或者从另一个角度来说,就是在玩游戏的你,具体操作的对象是"dady",他收到指令,然后去操作,你可以把goSchool操作指定给dady,mummy或son,而不必去考虑它们是怎样具体实现这些操作的。
2可以增加新的commond对象。比如说SIMS的0.0000001版里,dady只会eat,sleep两个操作,系统也只能对角色发出toEat和toSleep两个操作,而在0.00002版里,dady学会了paoniu和zhengqian,系统也要加上相应的to泡妞 and to挣钱 的指令。如果用了command模式,那么指令的增加,系统功能的扩展,由于不需要改动已有的类,将会是一件愉快的事情。
3command对象可以像其他的对象一样被操纵。比如一个toEat的指令对象,如果dady接受了这个对象后dady的weight + 2kg,然后两天以后,你发现dady太胖了,有得高血压的危险,想把昨天dady的toEat指令撤销,如果toEat指令对象有撤销操作的话那就很简单了,从日志里调出所有的toEat对象,然后一一执行toEat指令对象的撤销操作,就OK了。这在日志记录,操作的撤销恢复,事务的处理,命令复合时都十分的方便
欢迎指点[:)]
 
另外增加一点,如果仅仅考虑各种对象对某一指令的不同实现的话,应该使用strategy模式,例如dady对toEat指令的操作是“开冰箱、拿烤鸡和啤酒,吃鸡喝酒”而son的toEat指令操作是“开冰箱,拿冰激凌和蛋糕,吃冰激凌和蛋糕”,用strategy模式可以根据参数的不同,调用不同的实现。
command模式主要着眼于对于操作(指令)的操作更方便。
我刚刚在编程序,原来想用command模式的,然后发现不对,好像应该用strategy,[:(]
希望大家多指点
另外有兴趣的看看我的提议
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1968575
 
mor
我想COMMAND模式和STATEGY模式还有很大的区别的,简单的讲COMMAND模式是多个实体
对多个实现,STATEGY模式是一个实体对多个实现。在这里我演示的是多个实体
对多个实现,在ERP里面装配零件的过程就可以用COMMAND模式。
因为不同的零件可以用不同的组装方式。但是如果你计算折扣的话,你就要用到STATEGY
模式。
 
to billy_yuan:
是啊是啊,我本来想写点对于command模式作用以及如何用command模式的体会,写完第一段后发现好像有点问题,就再写了一段。因为我觉得在第一段里没有说清楚什么时候才要用到command模式。
你说的:“我想COMMAND模式和STATEGY模式还有很大的区别的,[blue]简单的讲COMMAND模式是多个实体对多个实现,STATEGY模式是一个实体对多个实现。[/blue]”我觉得很正确,多谢指正。
 
to mor
大家多学习学习啊!
你有什么好的例子也可以!
 
象你这么做游戏肯定是不行的,你写的只是虚函数的一个用法
游戏中的一些指令等文件一般是写成脚本(游戏自己的脚本),
然后放在一个目录中,类似于shell那样。
你看看UO等网络游戏的脚本就知道怎么回事了,最简单的就是
看一看网络游戏的鼻祖MUD了
 
to billy_yuan:
我现在在搞java,看jive的原码,里面有数不清的模式。我也常常想,这些模式在delphi里怎么实现,虽然不做delphi了,还是很怀念啊
 
to yanyandt2
我只是拿SIMS来打个比方罢了,我在学模式所以也就看到什么都考虑一下又没有什么模式了。游戏因为它特殊的情况肯定有特殊的设计方法,我以前有个同学对这个很着迷,我翻过他的东东,开发的模式的确和我们作的差异极大。
and 那里可以下到mud之类的原码?我想看看,看源码的确好处多多啊。
 
对,如果是游戏好像又差别比较大
 
to mor
ha ha ,你也在看JIVE么,我也在看JIVE,其实他里面的缓存机制还是做得很不错,
还有他的框架设计也很不错的。
 
一句话,command把请求的接收者与请求的唤醒者分耦
 

Similar threads

后退
顶部