装饰模式(Decorator)

意图:动态的给一个对象添加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更为灵活。
别名:Wrapper
结构图如下:
[img]http://dl.iteye.com/upload/attachment/0063/9712/f6f110e7-ab47-3f17-85c4-648d1fc5792c.png[/img]
Decorator维持一个指向Component对象的引用,并定义一个与Component接口一致的接口。
ConcreteDecorator则是负责向ConcreteComponent添加职责的类

Decorator将Operation()请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的操作。

示例代码如下

public abstract class Component {
public abstract void Operation();
}


public class Decorator extends Component {
protected Component component;
@Override
public void Operation() {
// TODO Auto-generated method stub
if (component != null) {
component.Operation();
}
}

public void Decorate(Component component) {
this.component = component;
}
}


public class ConcreteComponent extends Component {

@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.println("ConcreteComponent Operation");
}

}


public class ConcreteDecoratorA extends Decorator {
private String addedState;

@Override
public void Operation() {
super.Operation();
addedState = "Add a New State";
System.out.println("ConcreteDecoratorA Decorate Operation");
}

}


public class ConcreteDecoratorB extends Decorator {
@Override
public void Operation() {
super.Operation();
AddedBehavior();
System.out.println("ConcreteDecoratorB Decorate operation");
}

private void AddedBehavior() {
System.out.println("ConcreteDecoratorB private behavior");
}
}

客户端使用

public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteComponent obj = new ConcreteComponent();
ConcreteDecoratorA da = new ConcreteDecoratorA();
ConcreteDecoratorB db = new ConcreteDecoratorB();

System.out.println("Decorate obj");
da.Decorate(obj);
db.Decorate(da);

db.Operation();
}
}

运行结果

Decorate obj
ConcreteComponent Operation
ConcreteDecoratorA Decorate Operation
ConcreteDecoratorB private behavior
ConcreteDecoratorB Decorate operation


总结
1. 装饰模式符合开-闭原则,如果需要增加新的功能,只需要增加一个ConcreteDecoratorC等等,不需要修改其它的类,只要在客户端实例化一个ConcreteDecoratorC对象即可

ConcreteDecoratorC dc = new ConcreteDecoratorC();
dc.Decorate(db);

dc.Operation();

2. 调整ConcreteDecorator中Operation实现时父类Operation与子类操作的顺序,可以调整装饰的操作顺序

public class ConcreteDecoratorA extends Decorator {
private String addedState;

@Override
public void Operation() {
addedState = "Add a New State";
System.out.println("ConcreteDecoratorA Decorate Operation");
super.Operation();
}
}


public class ConcreteDecoratorB extends Decorator {
@Override
public void Operation() {
AddedBehavior();
System.out.println("ConcreteDecoratorB Decorate operation");
super.Operation();
}

private void AddedBehavior() {
System.out.println("ConcreteDecoratorB private behavior");
}
}

运行结果

Decorate obj
ConcreteDecoratorB private behavior
ConcreteDecoratorB Decorate operation
ConcreteDecoratorA Decorate Operation
ConcreteComponent Operation
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值