`
jguangyou
  • 浏览: 370074 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

装饰模式(Decorator)

 
阅读更多

     装饰模式又名包装模式,是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。举个例子,比如有一个车(Vehicle)对象, 现在提倡环保,车可以烧各种燃料,如电、天然气、柴油、汽油、氢气等,也可以烧几种燃料的组合,如果氢气和柴油,汽油和电等。如果这样使用继承,就会有很多的子类。这时可以使用装饰模式。

    主要角色:

  • 接口或者抽象基类:所有类的统一接口或父类
  • 被装饰对象:被装饰者。
  • 装饰角色:所有装饰类的父类。
  • 具体装饰

  采用继承类图:

  

 


 采用装饰模式类图:

 



 
 

示例代码:

   接口:

package com.dp.decorator;

public interface Vehicle {
	public void run();
}

 

被装饰对象:

package com.dp.decorator;

public class ConcreteVehicle implements Vehicle{

	@Override
	public void run() {
		System.out.print("我的动力系统是:");
	}

}

 

装饰角色:

package com.dp.decorator;

public class Decorator implements Vehicle{
	private Vehicle v;

	public Decorator(Vehicle v) {
		this.v= v;
	}

	@Override
	public void run() {
		v.run();
	}

}

 

具体装角色(汽油):

package com.dp.decorator;

public class GasolineDecorator extends Decorator {

	public GasolineDecorator (Vehicle v) {
		super(v);
	}
	public void power(){
		System.out.print("汽油");
	}
	public void run(){
	             super.run();
                             power();
	}
}

 

具体装角色(柴油):

package com.dp.decorator;

public class DieselDecorator extends Decorator {

	public DieselDecorator (Vehicle v) {
		super(v);
	}
	public void power(){
		System.out.print("柴油");
	}
	public void run(){
	             super.run();
                             power();
	}
}

 

具体装角色(太阳能):

package com.dp.decorator;

public class SolarDecorator extends Decorator {

	public SolarDecorator (Vehicle v) {
		super(v);
	}
	public void power(){
		System.out.print("太阳能");
	}
	public void run(){
	             super.run();
                             power();
	}
}

 客户端的调用:

package com.dp.decorator;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Vehicle v = new ConcreteVehicle();
		Decorator d = new GasolineDecorator(v);
                                d.run();//汽油
                                Decorator d1 = new DieselDecorator (d);
                                d1.run();//汽油和柴油
                     Decorator  d2 = new  SolarDecorator(d1);
                                d2.run();//汽油、柴油和太阳能,超强哈哈哈.. 
		
	}

}

 装饰器模式的适用场合:

  1. 需要给一个类扩展功能,或给一个类增加附加责任
  2. 需要动态的给一个类增加功能,还可以动态的撤消
  3. 需要增加有一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

装饰器模式在java io种得到了充分的运用,例如java.io.FilterInputStream采用的就是一个装饰器模式,这个类本身是一个装饰器的抽象类(父类), 他有许多的子类,是具体的装饰器。类图:


事情就是这么个事情,情况就是这么个情况,不对之处,多多指教.......
 

  • 大小: 26.4 KB
  • 大小: 33.6 KB
  • 大小: 45.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics