大话设计模式之装饰设计模式
Component是定义一个对象接口,可以给这些对象动态的添加职责。ConcreteComponent是定义了一个具体的对象,也可以给对象添加一些职责。Decorator,装饰抽象类,继承Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的,两者的关系是聚合关系(弱拥有)至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
====================================================================
装饰设计模式就是对已有的对象的功能进行增强
使用装饰设计模式的小例子:
/*
原体系:
House
|--PingFang
|--LouFang
无论将平房打造成田园还是欧式,都是对平房一种装修。
而该装修也可以用楼房。
将现将该装修定义好,需要把什么房子进行改装修,传入即可。
House
|--PingFang
|--LouFang
|--TianYuan
|--OuShi
*/
abstract class House
{
abstract void show();
}
class PingFang extends House
{
public void show()
{
System.out.println("平房");
}
}
class LouFang extends House
{
public void show()
{
System.out.println("楼房");
}
}
class TianYuan extends House
{
private House h;
TianYuan(House h)
{
this.h = h;
}
public void show()
{
System.out.println("田园风格");
}
public void showTianYuan()
{
h.show();
this.show();
}
}
class OuShi extends House
{
private House h;
OuShi(House h)
{
this.h = h;
}
public void show()
{
System.out.println("欧式风格");
}
public void showOuShi()
{
h.show();
this.show();
}
}
class HouseDemo2
{
public static void main(String[] args)
{
PingFang p = new PingFang();
LouFang l = new LouFang();
OuShi o = new OuShi(new TianYuan(p));
o.showOuShi();
//TianYuan t = new TianYuan(l);
//t.showTianYuan();
//OuShi o = new OuShi(l);
//o.showOuShi();
}
}
大家可以思考下若是使用继承的话有哪些局限性?
继承实现的例子:
/*
房子:平房,楼房。
House
|--PingFang
|--LouFang
准备对房子进行装修。
1,对平房进行田园风光式的打造。
2,对楼房进行欧式风格的打造。
可以用继承的方式来完成。
House
|--PingFang
|--TianYuanPingFang
|--LouFang
|--OuShiLouFang
该体系就有点臃肿,因为当平房想要改成欧式时,还要建立子类。
*/
abstract class House
{
abstract void show();
}
class PingFang extends House
{
public void show()
{
System.out.println("平房");
}
}
class TianYuanPingFang extends PingFang
{
public void showTianYuan()
{
super.show();
System.out.println("田园风格");
}
}
class LouFang extends House
{
public void show()
{
System.out.println("楼房");
}
}
class OuShiLouFang extends LouFang
{
public void showOuShi()
{
super.show();
System.out.println("欧式风格");
}
}
class HouseDemo
{
public static void main(String[] args)
{
PingFang p = new PingFang();
///p.show();
TianYuanPingFang t = new TianYuanPingFang();
t.showTianYuan();
LouFang l = new LouFang();
//l.show();
OuShiLouFang o = new OuShiLouFang();
o.showOuShi();
}
}
什么时候使用装饰设计模式呢?
装饰 模式是为已有功能动态地添加更多功能的一种方式。
如果当系统需要新功能的时候,采用的是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,在主类中加入新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地,按顺序的使用装饰功能包装对象。
把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样做有效的把类的核心职责和装饰功能分开了。而且可以去除相关类中重复的装饰逻辑。
关于装饰设计模式曾经在一篇大牛的翻译文章中看到过它的经典用处。具体的文章找不到了,但是这个例子很形象,大家可以想象下如果让你开发一个足球游戏时,根据球员的不同位置和职责是否能很好的联想到装饰设计模式。因为是要动态的添加行为。前锋(射门),中场,后卫(防守铲断)。不同的角色有不同的行为,并且不同的时刻也会角色互换,要求动态的添加包装一个footballPlayer。如果用继承就会很难实现动态的添加行为。一个类对另一个类的包装.包装类可以有自己除了被包装类有的方法之外的方法和属性。
大概就是这么个例子,大家可以自由发挥...