`

Decorator装饰模式

    博客分类:
  • Java
阅读更多

Decorator装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。继承为类型引入的静态特质的意思是说以继承的方式使某一类型要获得功能是在编译时。所谓静态,是指在编译时;动态,是指在运行时。

GoF《设计模式》中说道:动态的给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。

下面来看看Decorator模式的结构:

 

 

 

看这个结构好像不是很明白,下面我根据代码讲解一下这个结构。我想了一个场景:我们现在用的手机功能很多,我就用Decorator模式实现一下对某个手机的GSP和蓝牙功能扩展。

首先,我们需要一个手机的接口或者是抽象类,我这里就用抽象类来实现,代码如下:

 

 

package decorator_phone;

public abstract class AbstractCellPhone {
	public abstract String CallNumber();
    public abstract String SendMessage();
}

 

 

AbstractCellPhone也就是结构图中的Component,然后,我再来实现NokiaMoto的手机类,这类要继承AbstractCellPhone,也就是图中ConcreteComponent类要继承Component,实现代码如下:

 

 

package decorator_phone;

public class NokiaPhone extends AbstractCellPhone {

	public String CallNumber() {
		return "NokiaPhone call sombody";
	}

	public String SendMessage() {
		return "NokiaPhone send a message to somebody";
	}
}

 

package decorator_phone;

public class MotoPhone extends AbstractCellPhone {

	public String CallNumber() {
		return "MotoPhone call sombody";
	}

	public String SendMessage() {
		return "MotoPhone send a message to somebody";
	}
}

 

 

接下来我需要一个Decorator接口或者抽象类,实现代码如下:

分享到:
评论
2 楼 csdn_zuoqiang 2010-08-17  
AbstractCellPhone phoneMoto = new MotoPhone();
...
DecoratorGPS gpsMoto = new DecoratorGPS(phoneMoto);
...

如果你细心,会发现,上面调用类似我们读取文件时的调用:

FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);

实际上Java 的I/O API就是使用Decorator实现的,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.
1 楼 csdn_zuoqiang 2010-08-14  
package decorator_phone;


public abstract class Decorator extends AbstractCellPhone {

	private AbstractCellPhone _phone ;
		
	public Decorator(AbstractCellPhone phone) {
		_phone = phone ;
	}
	
	public String CallNumber() {
		return _phone.CallNumber();
	}

	public String SendMessage() {
		return _phone.SendMessage();
	}

}


正如结构图中,这个Decorator即继承了AbstractCellPhone,又包含了一个私有的AbstractCellPhone的对象。这样做的意义是:Decorator类又使用了另外一个Component类。我们可以使用一个或多个Decorator对象来“装饰”一个Component对象,且装饰后的对象仍然是一个Component对象。在下来,我要实现GSP和蓝牙的功能扩展,它们要继承自Decorator,代码如下:

package decorator_phone;

public class DecoratorGPS extends Decorator {
	
	public DecoratorGPS(AbstractCellPhone phoneGPS) {
		super(phoneGPS);
	}
	
	public String CallNumber() {
		return super.CallNumber() + " with GPS";
	}

	public String SendMessage() {
		return super.SendMessage() + " with GPS";
	}
}


package decorator_phone;

public class DecoratorBlueTooth extends Decorator {
	
	public DecoratorBlueTooth(AbstractCellPhone phoneGPS) {
		super(phoneGPS);
	}
	
	public String CallNumber() {
		return super.CallNumber() + " with BlueTooth";
	}

	public String SendMessage() {
		return super.SendMessage() + " with BlueTooth";
	}
}

最后,用客户端程序验证一下:

package decorator_phone;

public class TestPhone {
	public static void main(String[] args) {
		
		AbstractCellPhone phoneNokia = new NokiaPhone();
		
		System.out.println("============== 直接继承方式 ==============");
		System.out.println(phoneNokia.CallNumber());
		System.out.println(phoneNokia.SendMessage());
		
		//add GSP
        DecoratorGPS gpsNokia = new DecoratorGPS(phoneNokia);
        System.out.println("============== 经  过   装  饰 ==============");
        System.out.println(gpsNokia.CallNumber());
        System.out.println(gpsNokia.SendMessage());
        //add GSP and bluetooth
        DecoratorBlueTooth bluetoothNokia = new DecoratorBlueTooth(gpsNokia);
        System.out.println(bluetoothNokia.CallNumber());
        System.out.println(bluetoothNokia.SendMessage());
        
        
        AbstractCellPhone phoneMoto = new MotoPhone();
		
		System.out.println("\n============== 直接继承方式 ==============");
		System.out.println(phoneMoto.CallNumber());
		System.out.println(phoneMoto.SendMessage());
		
		//add GSP
        DecoratorGPS gpsMoto = new DecoratorGPS(phoneMoto);
        System.out.println("============== 经  过   装  饰 ==============");
        System.out.println(gpsMoto.CallNumber());
        System.out.println(gpsMoto.SendMessage());
        //add GSP and bluetooth
        DecoratorBlueTooth bluetoothMoto = new DecoratorBlueTooth(gpsMoto);
        System.out.println(bluetoothMoto.CallNumber());
        System.out.println(bluetoothMoto.SendMessage());
	}
}

结果是:

============== 直接继承方式 ==============
NokiaPhone call sombody
NokiaPhone send a message to somebody
============== 经  过   装  饰 ==============
NokiaPhone call sombody with GPS
NokiaPhone send a message to somebody with GPS
NokiaPhone call sombody with GPS with BlueTooth
NokiaPhone send a message to somebody with GPS with BlueTooth

============== 直接继承方式 ==============
MotoPhone call sombody
MotoPhone send a message to somebody
============== 经  过   装  饰 ==============
MotoPhone call sombody with GPS
MotoPhone send a message to somebody with GPS
MotoPhone call sombody with GPS with BlueTooth
MotoPhone send a message to somebody with GPS with BlueTooth

相关推荐

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    Decorator 装饰模式

    C#面向对象设计模式 Decorator 装饰模式 视频讲座下载

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    C#面向对象设计模式纵横谈\10 结构型模式Decorator装饰模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第10节:结构型模式Decorator装饰模式

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

    Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) (Level 300)

    装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或增强现有功能,而无需改变该对象的类。在C#中,装饰模式通常通过继承和组合来实现,它提供了一种灵活的方式来动态地改变对象的行为。在这个“C#...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    装饰器(Decorator)模式

    装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...

    Decorator装饰者模式

    在装饰者模式中,我们通常有两个主要的角色:Component(组件)和Decorator(装饰器)。Component是被装饰的对象接口,定义了所有装饰器和原始对象共同拥有的行为。Concrete Component是Component的具体实现,是实际...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    装饰者模式——Decorator

    装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    设计模式之 Decorator模式和代码实现

    【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    结构型模式之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...

Global site tag (gtag.js) - Google Analytics