风不静树不止
我要在新的一年里继续学习,我要在新的一年里继续奋斗,我要在新的一年里继续前行。
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 373 文章- 14 评论- 462
设计模式学习3——装饰者模式(Decorator)
没想到鼻炎还要做手术,这应该是出生到现在的第一个手术吧,据说是个小手术,呵呵,应该没有什么问题吧,不过得有10天左右的手术及休养时间,不知道设计模式的学习会不会被打断,嘿嘿。
装饰者模式
官方解释:
……
个人理解:如果要把多个类组合在一起,形成新的对象,除了使用继承然后多态,使用装饰者模式更加合适,不过据说这样的话,会出现很多的小类,导致代码的可理解性变差……
小实例: 技术支持中心的“老成员”们都有一起吃鸡蛋炒拉面的经历,这不,拉面店的老板要把他的生意“信息化、自动化”。拉面店大约有三四十种拉面吧,其中拉面都是一样的,只不过放进的佐料不同而已,比如:牛肉炒拉面、鸡蛋炒碰面等等。这情形最适合装饰者模式了。 画个图吧
上面的图是HeadFirst电子书里的,自己偷了个小懒,没有重新去画,于是上面的图只是介绍装饰者模式的,和下面的代码原理一样,不过不是下面代码的类图:
package
component;
public
class
Lamian
extends
Mian
{
public
float
UseTime()
{
return
30
;
}
}
//
-------下面是另一个文件了,这就是component
package
component;
public
abstract
class
Mian
{
String name;
public
String getName()
{
return
name;
}
public
abstract
float
UseTime();
}
装饰者们的代码:
装饰者
package
decorator;
import
component.Mian;
public
abstract
class
CondimentDecorator
extends
Mian
{
public
abstract
String getName() ;
}
//
--------------------------------
package
decorator;
import
component.Mian;
public
class
Egg
extends
CondimentDecorator
{
Mian lamian;
String name;
float
utime
=
15
;
//
吃鸡蛋要花费的时间
public
Egg(Mian la)
{
this
.lamian
=
la;
}
public
String getName()
{
return
null
;
}
public
float
UseTime()
{
return
lamian.UseTime()
+
utime;
}
}
//
---------------------------
package
decorator;
import
component.Mian;
public
class
ljiao
extends
CondimentDecorator
{
Mian lamian;
String name;
float
utime
=
3
;
//
吃辣椒要花费的时间
public
ljiao(Mian la)
{
this
.lamian
=
la;
}
public
String getName()
{
return
null
;
}
public
float
UseTime()
{
return
lamian.UseTime()
+
utime;
}
}
测试一下吧:
测试
package
test;
import
component.Lamian;
import
component.Mian;
import
decorator.Egg;
import
decorator.ljiao;
public
class
Test
{
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
Mian lamian
=
new
Lamian();
System.out.println(
"
拉面要吃
"
+
lamian.UseTime()
+
"
分钟。
"
);
Mian eggLamian
=
new
Lamian();
eggLamian
=
new
Egg(eggLamian);
System.out.println(
"
拉面加上一个鸡蛋要吃
"
+
eggLamian.UseTime()
+
"
分钟。
"
);
Mian oLamian
=
new
Lamian();
oLamian
=
new
Egg(oLamian);
oLamian
=
new
ljiao(oLamian);
System.out.println(
"
拉面加上一个鸡蛋再加上点辣椒要吃
"
+
oLamian.UseTime()
+
"
分钟。
"
);
}
}
测试结果截图:
posted @ 2008-05-27 13:10
张玉峰
阅读(73)
评论(2)
编辑
收藏
所属分类:
×设计模式×
发表评论
回复
引用
查看
#1楼
2008-06-15 10:34 |
超少
我想在拉面店要一份拉面加俩鸡蛋要辣椒
Lamian mylamian = new Lamian();
mylamian=new Egg(mylamian);
mylamian=new Egg(mylamian);
mylamian=new ljiao(mylamian);
this.label1.Text = "吃一份拉面加俩鸡蛋要辣椒用时间" + mylamian.UseTime().ToString()+"分钟";
回复
引用
查看
#2楼
2008-06-16 09:56 |
超少
如果拉面店的老板要把他的生意多元化,又卖大饼了。
//被装饰类
public class dabing:Lamian
{
//假设吃一张大饼要20分钟
public override float UseTime()
{
return 20;
}
}
我想在拉面店要一份大饼加俩鸡蛋要辣椒
Lamian mydabing= new dabing();
mydabing=new Egg(mydabing);
mydabing=new Egg(mydabing);
mydabing=new ljiao(mydabing);
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-05-27 13:17 编辑过
相关文章:
.NET设计模式系列文章
.NET设计模式(2):单件模式(Singleton Pattern)
相关链接:
所属分类的其他文章:
设计模式学习3——装饰者模式(Decorator)
Java内置的“观察者”
设计模式学习2——观察者模式(Observer)
设计模式学习1——策略模式(Strategy)
设计模式学习——设计原则
最新IT新闻:
Google股价跌破329美元 61%员工期权价值归零
十年祭:昔日明星软件今何在?
六大可能出售IT企业名单:SUN领头或被猎走
Linux内核2.6.27正式到来
《星际争霸2》一分为三 各种族依次登场
公告
狭隘过后,还有境界。。。
与我联系
发短消息
搜索
我参加的小组
程序员音乐空间
设计模式
读书(Books)
.Net+MySQL
Community Server
AJAX
CSS美化组
数据库
我参与的团队
数据库团队(4/280)
HiccDS俱乐部(0/824)
随笔分类
(250)
×JAVA×(16)
(rss)
×MySQL×(8)
(rss)
×PHP×(5)
(rss)
×SSH×(6)
(rss)
×Web应用×(4)
(rss)
×成长脚印×(30)
(rss)
×关于博客×(3)
(rss)
×设计模式×(5)
(rss)
×心情故事×(32)
(rss)
×杂七杂八×(4)
(rss)
×照片故事×(7)
(rss)
FMS流媒体(9)
(rss)
Linux(52)
(rss)
Linux-Fedora Core(22)
(rss)
Linux-SuSe(5)
(rss)
Linux-ubuntu(4)
(rss)
MacOsTiger(5)
(rss)
PHP+Apache+mysql(9)
(rss)
大道至简-算法
(rss)
收藏柜(24)
(rss)
随笔档案
(371)
2008年9月 (4)
2008年8月 (16)
2008年7月 (14)
2008年6月 (13)
2008年5月 (17)
2008年4月 (33)
2008年3月 (38)
2008年2月 (73)
2008年1月 (34)
2007年12月 (13)
2007年11月 (20)
2007年10月 (17)
2007年9月 (40)
2007年8月 (1)
2007年7月 (17)
2007年6月 (13)
2007年5月 (6)
2007年4月 (2)
积分与排名
积分 - 102074
排名 - 397
最新评论
1. re: (转)使.Net程序在未安装framework的电脑上运行(公布方法、源代码)
可能要用最新的飞信了。 (张玉峰)
2. re: Linux系统信息查看命令大全
啥意思,回复的这么抽象 (张玉峰)
3. re: linux下压缩解压-最简最帅教程
被你看到啦,嘿嘿 (张玉峰)
4. re: 最近写的一个Mysql存储过程
呵呵,现在这东东据说违反设计模式,一般是不用了,不过……偶尔抄个近道感觉很爽。 (张玉峰)
5. re: error while loading shared libraries的解決方法
有帮助。赞 (图书维基网)
6. re: 最近写的一个Mysql存储过程
20.2.11. 光标 手册中 (我也喜欢)
7. re: linux下压缩解压-最简最帅教程
好东西! (碎梦)
8. re: Linux系统信息查看命令大全
太好了,为我们开辟了一条道路 (不是神)
9. re: (转)使.Net程序在未安装framework的电脑上运行(公布方法、源代码)
在有framework的机器上可以
没有的机器上不行
怎么回事??? (fanxl)
10. re: NVIDIA显卡驱动标准安装方法!
很有用,顶 (不是神)
11. re: Php5 API 中文手册 下载(Php中文手册)
我收藏了,谢谢 (lfsnow)
12. re: Linux下的JDK选择
呵呵。 (张玉峰)
13. re: JAVA写入Mysql中文乱码解决方法
@fish119
已经改过,谢谢。 (张玉峰)
14. re: JAVA写入Mysql中文乱码解决方法
3.设置URL的时候: jdbc:mysql://localhost:3306/database?seUnicode=true&characterEncoding=UTF-8 ----... (fish119)
15. re: 黑莓使用必看帖子大汇集(转载)
你好,你发的很好,但是为什么你上面的所有的网页都打不开啊,请指教!能给我一封mail吗?lyuwj@163.com,在这先谢谢了! (lyu)
16. re: 方向盘开极品飞车9很Hapyy
这么会玩 (施杨)
17. re: (转)DateTable全解
好东西 顶下 (hunrizi)
18. re: Fedora下登录windown系统远程桌面(3389)
刚刚发现,在ubuntu下有自带的远程桌面工具,可以直接连接windows,太帅拉 (破名"超"难起)
19. re: Mac OSX 10.4.8下BCM5788网卡的完美安装
这么帅! (破名"超"难起)
20. re: Fedora下登录windown系统远程桌面(3389)
呵呵,我得试试
(破名"超"难起)
阅读排行榜
1. 此版本魔兽争霸III需要特定语言版本之Windows’ (5286)
2. 在Linux里设置环境变量的方法(export PATH)(3829)
3. ORA-01031: insufficient privileges的解决方法(3215)
4. 黑莓使用必看帖子大汇集(转载)(2263)
5. js操作select相关方法(收集)(1626)