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

悄悄话
发表文章: 10
注册时间: 2002年10月19日 21:19
设计模式之Decorator在餐馆中的应用 2002年11月25日 16:37 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表
Decorator定义:(动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.
为什么使用Decorator?
我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。
使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能。摘自(banq)

以到餐馆去吃饭为例:
eatFood()是我们主要做的事,可是在此之前,要点菜askFood(),吃完之后要payMoney(),有时还要给服务员小费giveFee();
因此,除了eatFood之外的方法是"即插即用"的方法,在运行期间可以不给小费等等。
第一步>定义一接口:
public interface EatIF {
public void eatFood();
}
第二步>定义一decoratee(被刷油漆者)
public class EatSupper implements EatIF {
public EatSupper() { }
public String eatFood() {
System.out.println("一般地吃饭,是一个被刷油漆者。。。");
return "";
}
}
第三步>定义油漆工:
public class EatDecorator implements EatIF {
private EatIF eat;
private ArrayList additiveMove=new ArrayList();//吃饭前后的一些动作放在这里
public EatDecorator(EatIF eatSupper) {
//EatDecorator往eatFood()添加其它方法,“刷油漆”
eat=eatSupper;//吃晚饭
additiveMove.add("用公款订一桌子,地点在香格里拉。。。");
additiveMove.add("每位女服务员给小费50日元");
}
public void eatFood() {
askFood();
eat.eatFood();
giveFee ();
}
public void askFood (){
System.out.println("吃饭前的第一步"+additiveMove.get(0).toString());
}
public void giveFee (){
System.out.println("吃饭的最后一步"+additiveMove.get(1).toString());
}
}
第四步>调用:
public class TestDecorator {
public static void main(String[] args) {
EatIF eatSupper=new EatSupper();
EatIF eatDecorator=new EatDecorator(eatSupper);
eatDecorator.eatFood();
}
}
YaSir

悄悄话
发表文章: 10
注册时间: 2002年10月19日 21:19
Re: 设计模式之Decorator在餐馆中的应用 2002年11月25日 16:40 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
那些腐败分子也在用设计模式。。。。。。:)
banq

悄悄话
发表文章: 9290
注册时间: 2002年08月03日 17:08
Re: 设计模式之Decorator在餐馆中的应用 2002年11月27日 22:15 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
写得不错,继续。

GoF的设计模式一旦领悟其实很简单。
richardluopeng

悄悄话
发表文章: 71
注册时间: 2002年08月30日 15:52
Re: 设计模式之Decorator在餐馆中的应用 2002年12月06日 15:26 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
板桥:


请问:
使用decorator模式的时候
EatIF eatSupper=new EatSupper();
EatIF eatDecorator=new EatDecorator(eatSupper);
再看看IO的decorator模式
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
为什么前者的对象类型都一样都是接口EatIF
而IO的decorator模式类型不一样,一个是FileReader,一个是BufferedReader???????

这样有什么区别吗???
banq

悄悄话
发表文章: 9290
注册时间: 2002年08月03日 17:08
Re: 设计模式之Decorator在餐馆中的应用 2002年12月07日 13:05 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
具体接口实现上差别不能影响判断Decorator模式。

主要抓住Decorator核心,在对象上附加一层“油漆”,在上例中,可以将
EatIF eatDecorator=new EatDecorator(eatSupper);中的EatIF再设定为新的接口,如果有必要的话。
hxz

悄悄话
发表文章: 88
注册时间: 2002年12月03日 10:16
Re: 设计模式之Decorator在餐馆中的应用 2002年12月10日 17:04 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我还是看不懂!
请具体讲讲对象上刷油漆?
hxz

悄悄话
发表文章: 88
注册时间: 2002年12月03日 10:16
Re: 设计模式之Decorator在餐馆中的应用 2002年12月10日 17:06 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
动态给一个对象添加一些额外的职责,就象在墙上刷油漆
????????????????添加职责象刷油漆?
hxz

悄悄话
发表文章: 88
注册时间: 2002年12月03日 10:16
Re: 设计模式之Decorator在餐馆中的应用 2002年12月10日 17:14 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
[zt]使用Decorator模式添加功能


作者:eclipse 发表时间:2002/10/17 06:00pm

使用Decorator模式添加功能

可能你已经在用Decorator模式了,但是跟所有其他模式一样,知道你为什么使用它,学习使用它跟别的开发者沟通是很重要的。


Decorator模式,即Wrapper模式,其强制控制作用是在不改动一个类的代码或者不破坏一个类的接口的情况下为该类添加功能。当你想一个类具有更多功能的时候,使用Decorator模式意味着增加功能后的版本不一定要通过扩展类来重用现有功能。


假定有一个叫做Action的接口有两个方法,act1()、act2()。这个接口有一个具体版本ConcreteAction,Decorator将会是一个实现Action的类,其构造器有一个Action(通常是ConcreteAction)。所以代码如下:

public class ActionDecorator implements Action {

private Action action;

public ActionDecorator(Action action) {
this.action = action;
}


public void act1() {
action.act1();
}

public void act2() {
// do nothing
}

}

使用Decorator比使用继承产生更少的类,所以其代码比较简单;但是它通常产生更多的对象,将导致调试难度增加,尤其是因为它增加了灵活度,可能会引入新的错误



//by chinaunix
banq

悄悄话
发表文章: 9290
注册时间: 2002年08月03日 17:08
Re: 设计模式之Decorator在餐馆中的应用 2002年12月11日 16:08 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
sorry 我的"添加职责"准确的说应该是"添加功能"。

油漆的概念就是加了一层的意思。

白墙上刷了油漆,功能就达到目的了:可以居住了。
dreameng

悄悄话
发表文章: 3
注册时间: 2003年07月29日 10:06
Re: 设计模式之Decorator在餐馆中的应用 2003年08月07日 17:33 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
不错
rypan

悄悄话
发表文章: 41
注册时间: 2003年09月13日 00:06
Re: 设计模式之Decorator在餐馆中的应用 2003年09月15日 16:08 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
FileReader和BufferedReader 应该是适配器模式吧?
水雨澍

悄悄话
发表文章: 46
注册时间: 2003年10月07日 00:07
Re: 设计模式之Decorator在餐馆中的应用 2003年10月10日 23:39 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
不,我觉得IO绝对是Decorator模式!
这个主题有 11 回复 / 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