装饰模式之半透明装饰模式

以下内容均为博主查阅资料后理解整理而得,如若转载,请注明出处:http://blog.csdn.net/cin_ie/article/details/6913642

上一篇写过装饰模式,这里再说下半透明的装饰模式的使用。其实很简单,一般情况下,纯粹的装饰模式很少用到,大部分情况下用到的都是半透明的装饰模式。

举个例子:在电影《变形金刚2》中,擎天柱获得了黑金刚的飞行能力,可以变形成灰机。但是,变形成灰机后的擎天柱还是擎天柱,并不是灰机。所以在定义被装饰后的擎天柱时,要用变形金刚接口来指定对象,而不能用被装饰后的类型指定对象。

Transformer 擎天柱 = new 擎天柱();

Transformer 能变飞机的擎天柱 = new 变飞机装饰类(擎天柱); // 这样是对的
		
变飞机装饰类 能变飞机的擎天柱 = new 变飞机装饰类(擎天柱); // 这样从理论上说,是不对的,因为擎天柱不是擎天柱,而永远的变成飞机了,擎天柱成霸天虎了。。。

但是在现实中,我们通常只需要用到被装饰后的某个功能,如,只需要擎天柱被装饰后的变飞机功能,而不需要别的。那么Transformer是没有变飞机功能的,就只能靠被装饰后的PlaneDecorator对象来达到目的

Transformer 擎天柱 = new 擎天柱();

变飞机装饰类 能变飞机的擎天柱 = new 变飞机装饰类(擎天柱);

能变飞机的擎天柱.变飞机(); // 这样,擎天柱就可以单独完成变飞机的动作了,而不必变成汽车后再变成飞机,带着4个车轮子在天上飞。
上面的第二种情况就是半透明装饰模式,他们的主要区别在客户端的调用上,与被装饰类的内部。具体代码如下。

/**
 * 变形金刚接口
 * Oct 28, 2011
 * @author 车前猛跑
 */
public interface Transformer {

	public void move ();
	
	public void transform ();
}

/**
 * 擎天柱,会动,会变形成大卡车
 * Oct 28, 2011
 * @author 车前猛跑
 */
public class OptimusPrime implements Transformer {

	@Override
	public void move() {
		System.out.println("我是擎天柱,我在动");

	}

	@Override
	public void transform() {
		System.out.println("我是擎天柱,变成大卡车");

	}

}

/**
 * 抽象装饰模块
 * Oct 28, 2011
 * @author 车前猛跑
 */
public class DecoratorTransformer implements Transformer{

	private Transformer transformer;
	
	public DecoratorTransformer () {
		
	}
	
	public DecoratorTransformer (Transformer transformer) {
		this.transformer = transformer;
	}
	
	@Override
	public void move() {
		transformer.move();
	}

	@Override
	public void transform() {
		transformer.transform();
	}

}
注意:下面是符合透明性要求的装饰类与客户端调用
/**
 * 擎天柱获得黑金刚的飞行能力
 * Oct 28, 2011
 * @author 车前猛跑
 */
public class PlaneDecorator extends DecoratorTransformer{

	public PlaneDecorator () {
		
	}
	
	public PlaneDecorator (Transformer transformer) {
		super (transformer);
	}
	
	
	@Override
	public void move() {
		super.move();
		this.transformPlane ();
	}

	@Override
	public void transform() {
		super.transform();
		this.transformPlane ();
	}

	public void transformPlane () {
		System.out.println("变形成飞机");
	}
}

/**
 * 
 * Oct 28, 2011
 * @author 车前猛跑
 */
public class Ex {


	public static void main (String [] args) {
		// 这里,我们新建了一个擎天柱对象
		Transformer optimusPrime = new OptimusPrime();
		
		// 满足透明性要求
		Transformer optimusPrimePlane = new PlaneDecorator(optimusPrime);
		optimusPrimePlane.move();
		System.out.println("----------");
		optimusPrimePlane.transform();


	}
}
执行结果如下:
我是擎天柱,我在动
变形成飞机
----------
我是擎天柱,变成大卡车
变形成飞机
这里可以看出,擎天柱变形飞机之前,要先动,或者先变形成汽车,这样显然不合理


注意:下面是半透明装饰类与客户端调用

/**
 * 擎天柱获得黑金刚的飞行能力
 * Oct 28, 2011
 * @author 车前猛跑
 */
public class PlaneDecorator extends DecoratorTransformer{

	public PlaneDecorator () {
		
	}
	
	public PlaneDecorator (Transformer transformer) {
		super (transformer);
	}
	
	
	/*@Override
	public void move() {
		super.move();
		this.transformPlane ();
	}

	@Override
	public void transform() {
		super.transform();
		this.transformPlane ();
	}*/

	public void transformPlane () {
		System.out.println("变形成飞机");
	}
}

/**
 * 
 * Oct 28, 2011
 * @author 车前猛跑
 */
public class Ex {

	public static void main (String [] args) {
		// 这里,我们新建了一个擎天柱对象
		Transformer optimusPrime = new OptimusPrime();
		
		// 满足半透明性要求
		PlaneDecorator plane = new PlaneDecorator(optimusPrime);
		plane.move();
		System.out.println("----------");
		plane.transform();
		System.out.println("----------");
		plane.transformPlane();
	}
}

执行结果如下:
我是擎天柱,我在动
----------
我是擎天柱,变成大卡车
----------
变形成飞机
这里的擎天柱,可以单独对待每一项功能,变形成汽车,动动,变形成灰机。


参考资料:《java与模式》阎宏

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值