JiveJdon Community Forums
在线272人   首页   主题总表   培训咨询   精华   查搜   注册    登陆
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 8 回复 / 1
 发表新帖子   回复该主题贴
manbaum

悄悄话
发表文章: 36
注册时间: 2003年03月21日 16:49
Decorator 的应用 2003年03月25日 11:08 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表
Decorator 其实是很普通的技术,估计大家都在用它而没有把它抽象为一种模式而已。其核心就是对已有的实现中可覆盖的方法进行覆盖,以便增加新的功能。

如 banq 在 Decorator 中所述,为了在打桩前做些必要的准备工作,比方要在方型桩上先钉个钉子(即所谓修饰),实现如下所述:

public interface IPeg
{
void Insert(String message);
}

public SquarePeg implements IPeg
{
public void Insert(String message)
{
// ...
}
}

public DecoratedSquarePeg extends SquarePeg
{
private void AddNail()
{
// 加钉子 ...
}

public void Insert(String message)
{
AddNail();
super.Insert(message);
}
}

banq

悄悄话
发表文章: 9316
注册时间: 2002年08月03日 17:08
Re: Decorator 的应用 2003年03月26日 10:16 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
是这样,Decorator 用起来太普遍,我们不知不觉的就在用它。
manbaum

悄悄话
发表文章: 36
注册时间: 2003年03月21日 16:49
Re: Decorator 的应用 2003年04月03日 12:18 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题

上次我贴的的实现有个问题,就是如果有大量不同的桩(M 种)需要做各种不同的装饰(N 种),则需要 (M*N) 种的组合来实现Peg子类,显然不合理,所以改变为另一种方式实现修饰,这样只需要实现 (M+N) 种组合。如下所述:

public DecoratedPeg implements IPeg
{
private IPeg _peg;
public DecoratedPeg(IPeg peg)
{
_peg = peg;
}

private AddNail()
{
// ...
}

public void Insert(String message)
{
AddNail();
_peg.Insert(message);
}
}


这样,对于使用桩子的函数,如:

void DoSomeWork(IPeg peg)
{
// ... get message ...
peg.Insert(message);
}

并不需要知道桩子有没有修饰,你可以
DoSomeWork(new SquarePeg());
也可以
DoSomeWork(new DecoratedPeg(new SquarePeg()));

感觉上说, Decorator 和 Adapter 有类似的地方,都是对一个已经实现了的类进行了新的包装。但是 Decorator 是对实现的包装,而 Adapter 是对接口的包装。即:Decorator 没有改变原实现的接口,而改变了接口的实现方法;而 Adapter 则相反,改变了原实现的接口,却没有改变原实现的实现方法。
banq

悄悄话
发表文章: 9316
注册时间: 2002年08月03日 17:08
Re: Decorator 的应用 2003年04月04日 14:12 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
分析得很有道理
coollzh

悄悄话
发表文章: 5
注册时间: 2003年04月09日 22:51
Re: Decorator 的应用 2003年04月09日 22:53 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
i feel this design pattern is like Delegate & Interface
jerrying

悄悄话
发表文章: 3
注册时间: 2003年04月16日 11:45
Re: Decorator 的应用 2003年04月16日 11:46 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
Decorator与Proxy在实现方式上很象
goldenypb

悄悄话
发表文章: 1
注册时间: 2003年04月28日 14:04
Re: Decorator 的应用 2003年04月28日 14:06 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
谢谢
xuruihao

悄悄话
发表文章: 3
注册时间: 2003年08月27日 13:37
Re: Decorator 的应用 2003年08月28日 15:26 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我觉得这段代码是不是Decorator模式还有得商量...
Decorator模式最根本的目标是为Decoratee动态得刷上新的功能,是代替继承的一种选择.上面的这例子通过super.Insert()和自己定义的增值功能来达到为Decortee增加功能的目的,但是任何一个继承自父类的子类都是可以通过super来调用父类的功能的.我觉得Decorator模式最重要的一点是在Decorator抽象类中(如果没有Decorator抽象类的话就在具体Decorator类中)拥有一个被Decorate的类的实例(或者被Decorator的抽象类的实例),通过这个实例来调用父类的功能,而不是简单的通过super来调用.这样才能跟继承有真正的区别.
我的看法,不知道对不对?
rypan

悄悄话
发表文章: 41
注册时间: 2003年09月13日 00:06
Re: Decorator 的应用 2003年09月15日 15:31 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
同意 xuruihao 的观点。

用钉子去装饰木桩并不恰当。有钉子的木桩可以当钉子使用吗?我觉得修饰模式简单一句话就是给名词加上形容词。

这个主题有 8 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam