Flyingis
Talking and thinking freely !
Flying in the world of GIS !
BlogJava
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
随笔:156 文章:16 评论:545 引用:0
[Design Pattern] The Decorator Pattern
作者:
Flyingis
按照常理,还是先阐述基本概念,Decorator Pattern可以用即时战略游戏中兵种的装甲强度来理解,举一个典型的例子,魔兽争霸(或冰峰王座等)中山丘是个非常厉害的角色了,经常能够一锤击毙敌人的英雄和士兵,因此被誉为英雄杀手。既然是英雄杀手,时常需要冲锋陷阵,在作战过程中自然会面临敌人的围攻,此时我们有多种方式来提升山丘的抗击打能力,一种是升级他的护甲,一种是通过魔法师给他施加增加防护的魔法,一种是等级到6时使用终极魔法来大幅度提高装甲的防护,还有一种就是使用无敌的魔法瓶,在规定时间内谁都拿他没辙,等等。虽然我不知道暴雪公司的工程师具体是如何实现这种功能设计的,但绝对不会是准备多个具有不同防御等级的山丘对象来供程序调用,如Shanqiu1、Shanqiu2……ShanqiuN,这样设计笨拙,代码繁多,如果游戏中其他兵种的装甲、攻击力的设计都是如此,那即使是天才团队也会天天在上帝面前祷告的。
Decorator Pattern在这种情况下就可以发挥作用了,在普通装甲升级时,使用普通的装甲升级的装饰器,在使用终极魔法时,使用终极魔法装甲升级的装饰器。
public
abstract
class
Soldier
{
String info
=
"
Soldier's name:
"
;
public
String getInfo()
{
return
info;
}
public
abstract
int
armor();
}
public
abstract
class
SoldierDecorator
extends
Soldier
{
public
abstract
String getInfo();
}
public
class
NormalArmorUpdate
extends
SoldierDecorator
{
Soldier soldier;
public
NormalArmorUpdate(Soldier soldier)
{
this
.soldier
=
soldier;
}
public
String getInfo()
{
return
soldier.getInfo()
+
"
Shanqiu normal update!
"
;
}
public
int
armor()
{
return
soldier.armor()
+
1
;
}
}
public
class
MagicArmorUpdate
extends
SoldierDecorator
{
Soldier soldier;
public
MagicArmorUpdate(Soldier soldier)
{
this
.soldier
=
soldier;
}
public
String getInfo()
{
return
soldier.getInfo()
+
"
Shanqiu magic update!
"
;
}
public
int
armor()
{
return
soldier.armor()
+
5
;
}
}
public
class
Shanqiu extend Soldier
{
public
int
armor()
{
//
初始装甲厚度
return
3
;
}
}
public
class
PlayingGame
{
public
static
void
main(String args[])
{
Soldier soldier
=
new
Shanqiu();
System.out.println(
"
Initialized armor:
"
+
soldier.armor());
//
普通装甲升级
soldier
=
new
NormalArmorUpdate(soldier);
System.out.println(
"
Initialized armor:
"
+
soldier.armor());
//
使用终极魔法后装甲升级
soldier
=
new
MagicArmorUpdate(soldier);
System.out.println(
"
Initialized armor:
"
+
soldier.armor());
}
}
这样就避免了建立多个Shanqiu类来描述他的不同状态,终极魔法时间过去后,还可以增加一个Decorator来减去相应的装甲厚度,给编程带来了方便。
Decorator Pattern设计的目的,是为了能够在运行时而不是编译期来动态改变对象的状态,使用组合的方式来增减Decorator,而不是去修改原有的代码来满足业务的需要,这样利于程序的扩展。当然,在Java中使用接口同样能够轻便的实现文中描述的业务需要,但哪种更好,哪种更优?
Java中的IO提供了大量Decorator Pattern设计的实例,在笔者很久的
一篇随笔
中对此进行了简单介绍,建议还是看看JDK的帮助文档。
参考资料:《Head First Design Pattern》
发表于 2006-11-07 11:04
Flyingis
阅读(2489)
评论(3)
编辑
收藏
所属分类:
架构与设计
评论
#
re: [Design Pattern] Decorator Pattern
SoldierDecorator should extends Soldier
#
re: [Design Pattern] Decorator Pattern
@jim[匿名]
I'm sorry. It's a terrible mistake and it has been corrected.
#
re: [Design Pattern] The Decorator Pattern
解释得很好,很具体,不过抽象一点说,Decorator Pattern是为了动态扩展父类的方法
新闻频道
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2006-11-08 08:47 编辑过
成果网帮您增加网站收入
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
相关文章:
[Design Pattern] The Factory Pattern
[Design Pattern] The Decorator Pattern
[Design Pattern] The Observer Pattern
ArcIMS 体系结构
剖析MVC中的各种Object
SOA介绍--什么是SOA?[转载]
GIS数据建库基本思想(下)
GIS数据建库基本思想(上)
<
2006年11月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
公告
Flyingis
博客空间内所有文章除特别声明为[转载],均为作者的学习心得和原创作品。如要转载,请注明作者名
flyingis及原文地址
联系方式
----
博客订阅
----
Google 广告
----
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(28)
给我留言
查看公开留言
查看私人留言
我参与的团队
架构师之家(0/0)
WebGIS开发设计组(0/0)
随笔分类
Algorithm(4)
(rss)
ArcEngine(9)
(rss)
ArcGIS Server(5)
(rss)
ArcIMS(7)
(rss)
ArcSDE(2)
(rss)
Diary(22)
(rss)
Eclipse Plugin(1)
(rss)
GIS-GPS-RS(28)
(rss)
Hibernate(6)
(rss)
JavaSE(28)
(rss)
Linux | Unix 技术(5)
(rss)
Web 客户端技术(24)
(rss)
Web 框架与开发(11)
(rss)
其他开源(3)
(rss)
架构与设计(8)
(rss)
随笔档案
2008年4月 (1)
2007年12月 (2)
2007年10月 (2)
2007年9月 (4)
2007年8月 (3)
2007年7月 (2)
2007年6月 (4)
2007年5月 (2)
2007年4月 (8)
2007年3月 (4)
2007年1月 (4)
2006年12月 (2)
2006年11月 (7)
2006年10月 (6)
2006年9月 (11)
2006年8月 (5)
2006年7月 (8)
2006年6月 (6)
2006年5月 (3)
2006年4月 (7)
2006年3月 (9)
2006年2月 (5)
2006年1月 (11)
2005年12月 (16)
2005年11月 (19)
2005年10月 (5)
文章分类
Health(1)
(rss)
Life(4)
(rss)
Recycle Bin(4)
(rss)
Technology(7)
(rss)
新闻档案
2006年10月 (1)
.Net 技术
ASP.net
(rss)
Ajax Technology
Ajaxian
(rss)
AjaxPatterns
Ajax中国
(rss)
ASP.Net Ajax
(rss)
Cross Browser
dp.SyntaxHighlighter
DWR
dynarch.com
(rss)
JavaScript Weblog
(rss)
Prototype
Rico
script.aculo.us
SoftComplex
WebFX
Eclipse Technology
Eclipse
Eclipsepowered
EclipseWorld
ESRI Technology
ESRI
(rss)
ESRI Developer Network
ESRI 中国
(rss)
ESRI 中国社区
GIS Technology
EOGEO
FreeGIS
GISuser.com
OGC
(rss)
OSGeo
uDig
Java Technology
Dev2Dev
(rss)
IBM developerWorks(CN)
IBM developerWorks(EN)
InfoQ
InfoQ in China
JavaEye
(rss)
Matrix
Openfans
(rss)
TheServerSide
(rss)
Linux Technology
LinuxSir
Ubuntu
中国Linux公社
Open Source
Apache
PostgreSQL
(rss)
SourceForge
个人博客
Flyingis in 3sNews
(rss)
Flyingis in cnblogs
(rss)
Flyingis in JavaEye
(rss)
精彩博客(技术类)
Carlwave-陆飞
(rss)
dudu
(rss)
emu
(rss)
Java Tang
(rss)
pesome
(rss)
sinoly
(rss)
zkjbeyond
(rss)
天狼
(rss)
姜利阳
(rss)
浩淼的天空
(rss)
蓝色森林
(rss)
马维峰
(rss)
精彩博客(非技术)
摄影博客-抓拍城市
(rss)
搜索
积分与排名
积分 - 314201
排名 - 13
最新评论
1. re: 小议final关键字
夯实基础,势在必行!
--Robert Hamming
2. re: 在Linux下安装JDK及环境设置
logout是为了让环境变量生效,source或切换用户就行。
--Flyingis
3. re: ArcGIS Server 开发系列(一)--编程框架总览
是发在博客上的系列文章
http://flyingis.cnblogs.com
--Flyingis
4. re: shapefile 和 MapGIS 文件格式之间的转换
相对完善的转换软件会有一定市场,现在用在哪些行业了?
--Flyingis
5. re: shapefile 和 MapGIS 文件格式之间的转换
评论内容较长,点击标题查看
--eeleo
阅读排行榜
1. JavaScript 调试工具(10693)
2. 在Linux下安装JDK及环境设置(10510)
3. ArcIMS 体系结构(6558)
4. DWR 中文文档(6328)
5. [翻译] 如何在 JavaScript 中实现拖放(上)(5187)
6. Hibernate学习心得--性能优化(4604)
7. [翻译] 如何在 JavaScript 中实现拖放(下)(4101)
8. 了解 Ajax 框架--充电开始(4053)
9. 正则表达式--JavaScript 实现基础(3955)
10. Java接口特性学习(3782)
11. IntelliJ IDEA 5.1 初步感受 + crack(3740)
12. ArcIMS 连接器--.NET Link 使用方法(3693)
13. [翻译] 如何在 JavaScript 中实现拖放(中)(3593)
14. 用 JavaScript 玩转 DOM Level 1(3550)
15. 测试你电脑功率的大小(3429)
评论排行榜
1. wallop 和orkut 的差异(143)
2. ArcIMS 连接器--.NET Link 使用方法(70)
3. IntelliJ IDEA 5.1 初步感受 + crack(16)
4. ArcIMS 体系结构(12)
5. [翻译] 如何在 JavaScript 中实现拖放(下)(11)