Decorator模式(孙悟空的七十二变) ( 积分: 100 )

G

gmsft

Unregistered / Unconfirmed
GUEST, unregistred user!
学习 阎宏《Java与模式》改写了其中的一个例子,
请高手指教。
逻辑单元:
unit ugmDasheng;
interface
uses
Dialogs;
type
{
大圣接口,Component角色;
}
IDasheng = interface(IInterface)
procedure Shuazi;
end;

{
大圣本尊,ConcreteComponent角色,实现大圣接口;
}
THusun = class(TInterFacedObject, IDasheng)
public
procedure Shuazi;
end;

{
大圣化身,Decorator角色
}
THuashen = class(TInterFacedObject, IDasheng)
private
FDasheng: IDasheng;
public
procedure Shuazi;
virtual;
end;

{
花儿——大圣化身之一,Concrete Decorator角色
}
THuaer = class(THuashen)
public
constructor Create(Dasheng: IDasheng);
procedure Shuazi;
override;
end;

{
鸟儿——大圣化身之二,Concrete Decorator角色
}
TNiaoer = class(THuashen)
public
constructor Create(Dasheng: IDasheng);
procedure Shuazi;
override;
end;

{
鱼儿——大圣化身之三,Concrete Decorator角色
}
TYuer = class(THuashen)
public
constructor Create(Dasheng: IDasheng);
procedure Shuazi;
override;
end;

implementation
{
************************************ THusun ************************************
}
procedure THusun.Shuazi;
begin
ShowMessage('老孙耍子去也!');
end;

{
*********************************** THuashen ***********************************
}
procedure THuashen.Shuazi;
begin
FDasheng.Shuazi;
ShowMessage('摇身一变……');
end;

{
************************************ THuaer ************************************
}
constructor THuaer.Create(Dasheng: IDasheng);
begin
FDasheng := Dasheng;
end;

procedure THuaer.Shuazi;
begin
inherited;
ShowMessage('花儿开了……');
end;

{
*********************************** TNiaoer ************************************
}
constructor TNiaoer.Create(Dasheng: IDasheng);
begin
FDasheng := Dasheng;
end;

procedure TNiaoer.Shuazi;
begin
inherited;
ShowMessage('鸟儿飞了……');
end;

{
************************************ TYuer *************************************
}
constructor TYuer.Create(Dasheng: IDasheng);
begin
FDasheng := Dasheng;
end;

procedure TYuer.Shuazi;
begin
inherited;
ShowMessage('鱼儿游了……');
end;

end.

界面单元:
unit ufmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmMain = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fmMain: TfmMain;
implementation
uses ugmDasheng;
{$R *.dfm}
//大圣本尊——猢狲——耍子去也
procedure TfmMain.Button2Click(Sender: TObject);
begin
THusun.Create.Shuazi;
end;

//大圣化身——花儿——耍子去也
procedure TfmMain.Button4Click(Sender: TObject);
begin
THuaer.Create(THusun.Create).Shuazi;
end;

//大圣化身——鸟儿——耍子去也
procedure TfmMain.Button5Click(Sender: TObject);
begin
TNiaoer.Create(THusun.Create).Shuazi;
end;

//大圣化身——鱼儿——耍子去也
procedure TfmMain.Button6Click(Sender: TObject);
begin
TYuer.Create(THusun.Create).Shuazi;
end;

//大圣化身——花儿、鱼儿、鸟儿——耍子去也
procedure TfmMain.Button7Click(Sender: TObject);
begin
TYuer.Create(TNiaoer.Create(THuaer.Create(THusun.Create))).Shuazi;
end;

end.
 
G

gmsft

Unregistered / Unconfirmed
GUEST, unregistred user!
学习 阎宏《Java与模式》改写了其中的一个例子,
请高手指教。
逻辑单元:
unit ugmDasheng;
interface
uses
Dialogs;
type
{
大圣接口,Component角色;
}
IDasheng = interface(IInterface)
procedure Shuazi;
end;

{
大圣本尊,ConcreteComponent角色,实现大圣接口;
}
THusun = class(TInterFacedObject, IDasheng)
public
procedure Shuazi;
end;

{
大圣化身,Decorator角色
}
THuashen = class(TInterFacedObject, IDasheng)
private
FDasheng: IDasheng;
public
procedure Shuazi;
virtual;
end;

{
花儿——大圣化身之一,Concrete Decorator角色
}
THuaer = class(THuashen)
public
constructor Create(Dasheng: IDasheng);
procedure Shuazi;
override;
end;

{
鸟儿——大圣化身之二,Concrete Decorator角色
}
TNiaoer = class(THuashen)
public
constructor Create(Dasheng: IDasheng);
procedure Shuazi;
override;
end;

{
鱼儿——大圣化身之三,Concrete Decorator角色
}
TYuer = class(THuashen)
public
constructor Create(Dasheng: IDasheng);
procedure Shuazi;
override;
end;

implementation
{
************************************ THusun ************************************
}
procedure THusun.Shuazi;
begin
ShowMessage('老孙耍子去也!');
end;

{
*********************************** THuashen ***********************************
}
procedure THuashen.Shuazi;
begin
FDasheng.Shuazi;
ShowMessage('摇身一变……');
end;

{
************************************ THuaer ************************************
}
constructor THuaer.Create(Dasheng: IDasheng);
begin
FDasheng := Dasheng;
end;

procedure THuaer.Shuazi;
begin
inherited;
ShowMessage('花儿开了……');
end;

{
*********************************** TNiaoer ************************************
}
constructor TNiaoer.Create(Dasheng: IDasheng);
begin
FDasheng := Dasheng;
end;

procedure TNiaoer.Shuazi;
begin
inherited;
ShowMessage('鸟儿飞了……');
end;

{
************************************ TYuer *************************************
}
constructor TYuer.Create(Dasheng: IDasheng);
begin
FDasheng := Dasheng;
end;

procedure TYuer.Shuazi;
begin
inherited;
ShowMessage('鱼儿游了……');
end;

end.

界面单元:
unit ufmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmMain = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fmMain: TfmMain;
implementation
uses ugmDasheng;
{$R *.dfm}
//大圣本尊——猢狲——耍子去也
procedure TfmMain.Button2Click(Sender: TObject);
begin
THusun.Create.Shuazi;
end;

//大圣化身——花儿——耍子去也
procedure TfmMain.Button4Click(Sender: TObject);
begin
THuaer.Create(THusun.Create).Shuazi;
end;

//大圣化身——鸟儿——耍子去也
procedure TfmMain.Button5Click(Sender: TObject);
begin
TNiaoer.Create(THusun.Create).Shuazi;
end;

//大圣化身——鱼儿——耍子去也
procedure TfmMain.Button6Click(Sender: TObject);
begin
TYuer.Create(THusun.Create).Shuazi;
end;

//大圣化身——花儿、鱼儿、鸟儿——耍子去也
procedure TfmMain.Button7Click(Sender: TObject);
begin
TYuer.Create(TNiaoer.Create(THuaer.Create(THusun.Create))).Shuazi;
end;

end.
 
D

dedema

Unregistered / Unconfirmed
GUEST, unregistred user!
路过.................看一看的.实现接口而己的.
 
Y

yanyandt2

Unregistered / Unconfirmed
GUEST, unregistred user!
我特别佩服那些在delphi里谈模式的人:)
delphi里的接口主要是为了com的,与java里的接口已经不一样了
况且,以delphi的实现方式来谈模式,太费劲了吧....
 

网事如风

Unregistered / Unconfirmed
GUEST, unregistred user!
To : yanyandt2
具体在Delphi几的我不知道了,不过在Delphi-6中InterFace已经是Delphi
<注意我不提pascal>的语言元素了,跟COM没有任何关系了,当然COM的实现要借助
Interface来实现!
无知不可怕,可怕的是把无知当作真理到处宣传啊!
只要是面向对象的语言,都可以实现接口,容易与否全在个人修炼,和语言基本无关,
我也是从DELPHI入门的设计模式,所以看着你上面的话不爽,说几句,如果你觉得不爽,
大可以继续,本人不再跟帖!
 
Y

yanyandt2

Unregistered / Unconfirmed
GUEST, unregistred user!
具体在Delphi几的我不知道了,不过在Delphi-6中InterFace已经是Delphi
<注意我不提pascal>的语言元素了,跟COM没有任何关系了,当然COM的实现要借助
Interface来实现!
兄弟,你先学懂delphi里的接口先!跟COM没有任何关系了?呵呵,你问问
borland 有这个勇气吗?
另外,你先学学什么是接口,以及为什么用接口。
 
G

gmsft

Unregistered / Unconfirmed
GUEST, unregistred user!
自己顶一顶。
小可菜鸟,欢迎批评。
摆弄了一夜,没搞懂 MM ,哪位大侠指点一二?
或者帮忙作一个类图?
email:gmsft@126.com
 
G

gmsft

Unregistered / Unconfirmed
GUEST, unregistred user!
附上代码:
http://bbs.2ccc.com/topic.asp?topicid=163571
 
Y

yanyandt2

Unregistered / Unconfirmed
GUEST, unregistred user!
非常不明白为什么一些人总是给delphi强加一些它本来不合适的角色,
所谓尺有所短,寸有所长,更加要扬长避短,为什么非要用delphi
做它不合适做的事?
 
G

gmsft

Unregistered / Unconfirmed
GUEST, unregistred user!
来自:yanyandt2, 时间:2005-4-22 10:29:28, ID:3053402
非常不明白为什么一些人总是给delphi强加一些它本来不合适的角色,
所谓尺有所短,寸有所长,更加要扬长避短,为什么非要用delphi
做它不合适做的事?
请教:Delphi 适合作什么?什么又适合应用模式呢?
 
K

kkkchenA

Unregistered / Unconfirmed
GUEST, unregistred user!
来自:yanyandt2, 时间:2005-4-22 10:29:28, ID:3053402
非常不明白为什么一些人总是给delphi强加一些它本来不合适的角色,
所谓尺有所短,寸有所长,更加要扬长避短,为什么非要用delphi
做它不合适做的事?
不同意。
 
Y

yanyandt2

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi 是一个适合快速应用开发的工具,虽然VCL很优秀,但那从根本上来说
都是从封装windows API而来的。
而windows API,就不是面向对象的,现在的.net是面向对象的类库了。
其次,delphi本身的类库vcl所提供的类和方法对于设计模式来说还不足够,
而且delphi的类的实现方式是在堆中,不是栈中,但又不能象java一样管理
内存。
这些都导致了在delphi中谈某种设计模式都是不切实际的,尤其是和实际应用
开发相关--当然如果只是玩玩无所谓。
所以,用delphi谈设计模式,是不切实际的。
应该注重的是delphi快速应用开发方面(快速的意思不是乱)。
 

网事如风

Unregistered / Unconfirmed
GUEST, unregistred user!
不想和你说什么了,看看下面的话,无知者无畏啊!(:
 “兄弟,你先学懂delphi里的接口先!跟COM没有任何关系了?呵呵,你问问
borland 有这个勇气吗?另外,你先学学什么是接口,以及为什么用接口。 ”
不懂接口我在这跟你费什么话啊!在Delphi中接口的出现是因为COM的需要,简单点说就是为了实现COM.反过来当语言的发展到了需要接口的时候,Delphi中就把接口做为了它的语言元素,也就是接口跟COM没有了任何关系,但是COM的实现要借助接口来实现,You Know?
一看就是个大话王,"而windows API,就不是面向对象的,现在的.net是面向对象的类库了。",哥哥你用过.NET吗?微软在发布.NET的时候,本来想重新把windows API函数封装了来用的,结果发现工程量很大,所以作罢,你可以到<C#高级编程>里找找原话,咱家吹不来(: 所以在.NET中,尤其在做WinForm程序的时候,<现在的项目就是基于C#的WinForm开发>很多功能用.NET的类库是实现不了的,必须调用WinAPI来实现的,你知道DllImport这个属性吗?回头看看去!
“而且delphi的类的实现方式是在堆中,不是栈中,但又不能象java一样管理内存。”
关于这句话很是疑惑,是的是的,没错,delphi的类的实现方式是在堆中,不是栈中,难道java的实现就是基于栈中,不是基于堆中的吗?那你知道Delphi中的var是什么意思吗?那你知道.NET中的ref什么意思吗?可笑啊可笑!!!说句不客气的话自动管理内存对于开发来说是高效率了,可是对于程序员来说,是可怜的,没说别人,我相信别的真正的程序员也会象我一样,会多多研究底层的实现的,嚼着别人吃过的饭很香吗?
  设计模式的出处在哪里呢?没错,是出自4位面向对象的牛人,俗称为四人帮的一本书:“ Design Patterns:Elements of Reusable Object-Oriented software”,
中文译名叫“ 设计模式:可复用面向对象软件的基础”,那么设计模式和语言有关吗?没错,有关,必须是面向对象的语言,那么Delphi不是面向对象的吗?给你几个胆你也不敢说吧!
“这些都导致了在delphi中谈某种设计模式都是不切实际的,尤其是和实际应用
开发相关--当然如果只是玩玩无所谓。”靠,都是不切实际的,你深入研究过VCL的代码吗?那里用了很多的设计模式,你不是说都是不切实际的吗,记得上学时候老师说过:“要说明它是真确的,必须证明,要说明它是错误的,举个反例就可以了”,我也举一个例子,批驳你一下:通常释放对象不直接调用对象的Dertory(),而是定义一个free()方法,然后在free中调用Dertory()来实现对象的释放,你不是很能吗?说说这个用了什么模式啊,为什么要这样用呢,大虾??您不是说不能用吗?(差点写错,查了一下,是虾米的虾(:)
  “应该注重的是delphi快速应用开发方面(快速的意思不是乱)。”,还第一次听说怕把快速和乱搞混了啊,您是不是曾经混过啊?
 
S

Smile.java

Unregistered / Unconfirmed
GUEST, unregistred user!
几位大侠讨论一下在Delphi中设计模式对于中小型数据库管理软件的实际应用。
小弟面向对象刚刚入门,看看楼上的大侠说得很热闹,来学习。
 
W

wang_phoenix

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上说得有理,看来某些同志要多学学Delphi下的设计模式了![:)]
 
Y

yanyandt2

Unregistered / Unconfirmed
GUEST, unregistred user!
1.delphi中的接口仍然是对象。这点你去学习一下。
2。你根本不知道ms 的 .net 用意。MS的COM目的就是为了实现对象化,其实COM
在这点也做的不错,可是windows API却不是。因此 .net的出现也是为了实现
这个目标。至于你说的某些类无法实现,那不代表以后 .net 一直都是这个
样子。
3。你告诉我vcl里用了哪些设计模式?我估计你也看不出来。
4。至于你说的那个不 destroy,而用 free,那个叫设计模式吗?
5。delphi的快速确实被人理解为乱,比如一个项目,50多个窗体混合在一起,确实
很快,但是也确实很乱。
我初学的时候确实乱过,但是现在我已经有了自己的framework,仍然很快,但是
不乱。
给你提个建议,我没说delphi不好,要是不喜欢delphi,我也不用天天来这啊。
头脑冷静点吧,delphi不是无敌的。
 
B

Beyondbill

Unregistered / Unconfirmed
GUEST, unregistred user!
来自:yanyandt2, 时间:2005-4-22 15:41:41, ID:3053882
delphi 是一个适合快速应用开发的工具,虽然VCL很优秀,但那从根本上来说
都是从封装windows API而来的。
而windows API,就不是面向对象的,现在的.net是面向对象的类库了。
其次,delphi本身的类库vcl所提供的类和方法对于设计模式来说还不足够,
而且delphi的类的实现方式是在堆中,不是栈中,但又不能象java一样管理
内存。
这些都导致了在delphi中谈某种设计模式都是不切实际的,尤其是和实际应用
开发相关--当然如果只是玩玩无所谓。
所以,用delphi谈设计模式,是不切实际的。
应该注重的是delphi快速应用开发方面

不知道楼上的对DELPHI源代码熟悉多少,可知道DELPHI代码中很多地方处理包含模式.
常见的<数据敏感组件>到<TActionList>,就连TCollection与TCollectionItem的实现都有模式的存在.
难道有了自己的回收内存机制就变成了面向对象了?
 
V

vickymade

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi的VCL仅仅是封装Win API的?
简直让我晕死,看看李维的VCL架构剖析,再看看刘艺的Delphi模式编程去吧,写得都很清楚,这里就不再举例子说明了(最主要的原因是因为:我很懒,而且老婆要求我马上睡觉)。
另外,设计模式跟具体的语言有什么关系啊。仅仅是方法论而已。
 

张鸿林

Unregistered / Unconfirmed
GUEST, unregistred user!
楼主的例子确实是一个典型的装饰者
因为不够形象,让人以为不过接口技术而已
即使不支持接口的面向对象语言,也可以实现大部分模式方法
使用纯粹抽象类,在大部分情况下也可以代替接口
是笔就能写字
认为c++,java才跟模式相关的人,跟认为只有金笔(何况,是不是金笔?别人就不是金笔?)才能写字一样可笑
 
Y

yanyandt2

Unregistered / Unconfirmed
GUEST, unregistred user!
<数据敏感组件>到<TActionList>, 也能叫模式?照这么说,TEdit也是模式了。
另外,设计模式跟具体的语言有什么关系啊
那你用basic语言或者VB来搞搞模式。
再看看刘艺的Delphi模式编程去吧
尽信书,不如无书。
 
顶部