所谓装饰器模式,即可以灵活的为已有的功能添加新的功能。具体的实例如下:
有一个变形金刚的抽象类:
package com.DesginPolicyLearn.Decorate;
/*
* author:Tammy Pi
* function:变形金刚的抽象类
*/
public abstract class Transformer {
public abstract void show();
}
此变形金刚的抽象类具有一个装饰器,为它添加装备。
package com.DesginPolicyLearn.Decorate;
/*
* author:Tammy Pi
* function:变形金刚的装饰类
*/
public class TransformerDecorator extends Transformer{
protected Transformer transformer;
public void setComponent(Transformer comp) {
this.transformer = comp;
}
public void show() {
if(this.transformer!=null){
this.transformer.show();
}
}
}
有两种装备的变形金刚。一个是带翅膀的变形金刚。
package com.DesginPolicyLearn.Decorate;
/*
* author:Tammy Pi
* function:带翅膀的变形金刚
*/
public class WingTransformer extends TransformerDecorator{
public void show() {
System.out.println("带翅膀");
super.show();
}
}
一个是带武器的变形金刚:
package com.DesginPolicyLearn.Decorate;
/*
* author:Tammy Pi
* function:带武器的变形金刚
*/
public class WeaponTransformer extends TransformerDecorator{
public void show() {
System.out.println("带武器");
super.show();
}
}
这样我们就可以用装饰器灵活的为变形金刚上装备了:
package com.DesginPolicyLearn.Decorate;
/*
* author:Tammy Pi
* function:测试装饰模式
*/
public class TestDecorator {
public static void main(String[] args){
TransformerDecorator trans1 = new WingTransformer();
TransformerDecorator trans2 = new WeaponTransformer();
trans1.setComponent(trans2);
trans1.show();
}
}
有了装饰器模式,我们还可以用新的子类继承至TransformerDecorator,可以扩展出三只眼睛的变形金刚、披着斗篷的变形金刚。灵活的将它们组装在一起。
装饰器模式,将类的核心职责和装饰功能分开了。我们将装饰功能写在装饰器类中,其他类继承它,不用再理会装饰方法。这样就使得装饰方法得以重用,去除类中重复的装饰逻辑。