liuqiang5151
BlogJava
::
首页
::
联系
::
聚合
::
管理
0 Posts :: 23 Stories :: 1 Comments :: 0 Trackbacks
留言簿
(18)
给我留言
查看公开留言
查看私人留言
我参与的团队
文章分类
Ajax(2)
Hibernate(3)
java(10)
Lucene(2)
Spring(3)
数据库(1)
设计模式(2)
文章档案
2008年7月 (3)
2008年5月 (3)
2008年4月 (5)
2007年12月 (1)
2007年11月 (1)
2007年10月 (1)
2007年9月 (9)
搜索
最新评论
1. re: 转:DWR util.js工具包的使用[未登录]
关于useLoadingImage的使用,我都无法写成功,您能否把源代码发到我的邮箱?
wl_polo@163.com
不胜感谢!
--王冰
原:装饰器模式
在OO中,继承可以达到代码复用的目的。但是滥用继承却会使代码具有一定的耦合性。究竟继承应该怎样用,什么时候用,装饰器模式给出了一个很好的例子。
废话少说,举个例子先。就举个上帝造人的例子吧,首先创建一个Human的基类。
public
abstract
class
Human
{
final
void
create()
{
System.out.println(
"
create a person
"
);
}
protected
abstract
void
doSkill();
}
这里有一个抽象方法,并且定义了一个final方法,这就意味着子类不能继承这个方法,而必须重写doSkill方法,doSkill方法到底做什么用一会再探讨。现在我们只知道当实例化一个Human之后,一个person就成型了。下面让我们分别写两个子类。
public
class
Man
extends
Human
{
@Override
protected
void
doSkill()
{
//
TODO Auto-generated method stub
System.out.println(
"
Im a man
"
);
}
}
public
class
Woman
extends
Human
{
@Override
protected
void
doSkill()
{
//
TODO Auto-generated method stub
System.out.println(
"
Im a woman
"
);
}
}
最基本的,男人和女人。人是造好了,要让他们学东西了。下面就引出了最关键的一个类,装饰器类。
public
abstract
class
DecratorSkill
extends
Human
{
protected
void
pri()
{
System.out.println(
"
im skill
"
);
}
}
是一个描述技能的类,要装饰到人的身上,给他们赋予技能。
public
class
Eye
extends
DecratorSkill
{
Human skill;
public
EagleSkill(Human skill)
{
this
.skill
=
skill;
}
@Override
protected
void
doSkill()
{
//
TODO Auto-generated method stub
skill.doSkill();
System.out.println(
"
eye
"
);
}
}
眼睛的类,能看东西。
public
class
Ear
extends
DecratorSkill
{
Human skill;
public
WolfSkill(Human skill)
{
this
.skill
=
skill;
}
@Override
protected
void
doSkill()
{
//
TODO Auto-generated method stub
skill.doSkill();
System.out.println(
"
ear
"
);
}
}
听东西。
好了,主要类都写完了,下面连上测一下
public
class
Test
{
public
static
void
main(String[] args)
{
//
TODO Auto-generated method stub
Human role
=
new
Man();
role
=
new
Ear(
new
Eye(role));
role.create();
role.doSkill();
}
}
打印出
create a person
Im a man
eye
ear
让我们来看一下DecratorSkill这个类,构造函数里面传进来一个Human类的子类的引用,保存起来,当调用doSkill方法的时候,根据多态性调用相应的doSkill方法
再累加上当前类的技能,也就是println出来的那句话,依次类推一直返到最外层,这样最外层的引用当调用doSkill方法的时候就会逐个打印出相应的技能。
这样在程序运行的时候动态的赋予了对象的职责,试想一下如果不这样做,我们要写多少个这样的类,现在只有Eye Ear这两个类,可以组合成一个能看到并且能听到的类,当我们再加入hand, leg,head这些类的时候可以组合成不同的技能,那简直是类爆炸。
其实在我们日常开发中,装饰器模式随处可见,java.io包就是装饰器模式的最好代表。有一个基类InputStream 下面有几个不同的子类FileInputStream ByteArrayInputStream还有一个FilterInputStream,这个类就是装饰类,像BufferedInputStream就是继承FilterInputStream这个类的,在使用的时候我们需要InputStream is = new FileInpuStream("1.txt"),这样生成了一个基本的读文件的类,现在我们需要加入带缓冲区的功能,那我们就用BufferedInputStream这个类来包装,is = new BufferedInputStream(is),就可以实现带缓冲区的功能了。
好了 今天先写这么多。
posted on 2008-05-28 18:35
刘强
阅读(248)
评论(0)
编辑
收藏
所属分类:
设计模式
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
原 设计模式一些原则
原:装饰器模式
Copyright @ 刘强
Powered by:
.Text
and
ASP.NET
Theme by:
.NET Monster