以下内容均为博主查阅资料后理解整理而得,如若转载,请注明出处: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与模式》阎宏