装饰器模式(Decorator)

这里似乎可以解释之前的一个疑惑:

装饰器模式与对象的适配器模式的异同:
相同点:都拥有一个目标对象
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口
换句话说,适配器模式就是把一个对象是配成另一个对象,而装饰器模式将丰富目标对象的功能但不改变它的接口
装饰器的核心思想

Decorator装饰器,动态的给一个对象添加一些额外的职责
具有如下特征:
它必须具有一个装饰对象
它必须拥有与装饰对象相同的接口
它可以被装饰对象添加额外的功能
源接口:
public interface Sourcable {
public void operation();
}
源类:
public class Source implements Sourcable{
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("原始类的方法");
}
}
装饰器类:
public class Decorator1 implements Sourcable{
private Sourcable source;
public Decorator1(Sourcable source) {
super();
this.source = source;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("第1个装饰器装饰前");
source.operation();
System.out.println("第1个装饰器装饰后");
}
}
装饰器类:
public class Decorator2 implements Sourcable{
private Sourcable source;
public Decorator2(Sourcable source) {
super();
this.source = source;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("第2个装饰器装饰前");
source.operation();
System.out.println("第2个装饰器装饰后");
}
}
装饰器类:
public class Decorator3 implements Sourcable{
private Sourcable source;
public Decorator3(Sourcable source) {
super();
this.source = source;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("第3个装饰器装饰前");
source.operation();
System.out.println("第3个装饰器装饰后");
}
}
测试类 :
public class DecoratorTest {
public static void main(String[] args) {
Sourcable source=new Source();
Sourcable obj=new Decorator1(
new Decorator2(
new Decorator3(source)));
// Sourcable obj=new Decorator2(source);
obj.operation();
}
}
结果:
第1个装饰器装饰前
第2个装饰器装饰前
第3个装饰器装饰前
原始类的方法
第3个装饰器装饰后
第2个装饰器装饰后
第1个装饰器装饰后
装饰器模式的使用及缺点:

在以下情况使用:
需要扩展一个类的功能,或者给一个类增加附加的功能
需要给一个对象增加功能,这些功能可以动态撤销
需要增加由一些基本排列组合产生大量的功能,从而使继承关系变得不现实
缺点:
较少的使用类,但会产生更多的对象,在进行错误查询时变得更困难。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值