Java设计模式之--装饰模式Decorator Pattern

首先,当我们遇到什么样的问题时,我们要用Decorator解决呢?

例如,生活中身边最常见的水杯,不仅有不同大小,而且有不同颜色等,我们按继承的做法:[img]http://dl.iteye.com/upload/attachment/0064/7925/089ccd6b-bcd4-3189-b908-3cedb76340c9.png[/img]
图画的难看了,大家将就一下,咱也不是美工出身 O(∩_∩)O~



abstract class Cup{
abstract void volume();
}


interface Color{
void color();
}

//实体类Code
class Cup300ml extends Cup {
public void volume(){
System.out.print("300ml cup");
}
}
class Cup500ml extends Cup{
public void volume(){
System.out.print("500ml cup");
}
}
class Cup700ml extends Cup{
public void volume(){
System.out.print("700ml cup");
}
}

//各种颜色的添加
class Cup300mlRed extends Cup300ml implements Color{

@Override
public void color() {
System.out.print("red color");
}

}
class Cup500mlRed extends Cup300ml implements Color{

@Override
public void color() {
System.out.print("red color");
}
}
class Cup700mlRed extends Cup300ml implements Color{

@Override
public void color() {
System.out.print("red color");
}
}
class Cup300mlYellow extends Cup300ml implements Color{

@Override
public void color() {
System.out.print("yellow color");
}
}


不难发现,子类会成级数增长。

[color=red]Question:[/color]问题的所在就是:
我们“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态物质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能组合)会导致更多子类的膨胀。

[color=green]Solution:[/color]采用装饰模式:
[color=brown]动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
------《设计模式》GOF[/color]

装饰模式的 结构图:

[img]http://dl.iteye.com/upload/attachment/0064/7940/3a74dc7e-1868-3921-974b-b99f90fcbc91.png[/img]


具体代码实现:

abstract class Cup{
abstract void volume();
}

//模式结构图中的Component
interface Color{
void color();
}

//模式结构图中的ConcreteComponent
class Red implements Color{

@Override
public void color() {
System.out.print("red color");
}

}
class Yellow implements Color{

@Override
public void color() {
System.out.print("yellow color");
}

}

//模式结构图中的Decorator
class Cup300ml extends Cup {

//在类里面,添加组合接口类Color,作为私有成员
private Color mColor;

public void volume(){
System.out.print("300ml cup ");
mColor.color();
}
//在构造器中,将组合成员以参数形式传入
public Cup300ml(Color c){
mColor = c;
}
}
class Cup500ml extends Cup{
private Color mColor;
public void volume(){
System.out.print("500ml cup ");
mColor.color();
}
public Cup500ml(Color c){
mColor = c;
}
}
class Cup700ml extends Cup{
private Color mColor;
public void volume(){
System.out.print("700ml cup ");
mColor.color();
}
public Cup700ml(Color c){
mColor = c;
}
}



[color=green]Test:[/color]测试:

public class Test{

public static void main(String a[]){
Red red = new Red();
Yellow yellow = new Yellow();
Cup300ml cup300 = new Cup300ml(red);
Cup500ml cup500 = new Cup500ml(yellow);
cup300.volume();
cup500.volume();
}
}


总结:
Decorator Pattern就如生活中的壁画一般:
[img]http://dl.iteye.com/upload/attachment/0064/7858/d3126786-389a-36c3-bdc7-6be667b4e1cc.png[/img]
[color=brown]适用性:
需要扩展一个类的功能,或给一个类增加附加责任。
需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。[/color]
通过采用[color=red]组合、而非继承[/color]的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差"和"多子类衍生问题"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值