Decorator(装饰者)

Decorator(装饰者) 结构型 对象 1

Intent_意图2

动态地将责任附加到对象上。

Motivation_动机3

一般为了扩展类的功能,经常会选择使用继承的方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀

Applicability_适用性4

1.在不想增加过多子类的情况下扩展类

Structure_结构5

在这里插入图片描述

Participants_参与者6

  • Component(抽象构件) 定义一个抽象类(或接口)以规范准备接收附加责任的对象
  • ConcreteComponent(具体构件) 继承(或实现)Component,通过装饰角色为其添加一些职责
  • Decorator(抽象装饰) 继承(或实现)Component,并包含ConcreteComponent的实例,可以通过子类扩展ConcreteComponent的功能
  • ConcreteDecorator(具体装饰) 实现Decorator的相关方法,并给ConcreteComponent对象添加附加责任

Collaborations_协作7

Component定义一个抽象类(或接口)
  ->ConcreteComponent继承(或实现)Component
  ->Decorator继承(或实现)Component
    ->ConcreteDecorator实现Decorator的方法,并给ConcreteComponent对象附加新的职责
依赖继承来扩展装饰者,以达到“类型匹配”的目的,类的行为只能在编译时静态决定
采用接口来扩展装饰者,以达到自由组合的目的,类的行为在运行时动态添加

Comsequences_结果8

  • 优点
    对比于继承来扩展对象的功能,装饰者模式有更好的弹性
    装饰者可以在被装饰者的行为前面/后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的
    可以用无数个装饰者包装一个组件
    装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
  • 缺点
    装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂
  • 用途
    扩展一个类的功能
    动态增加功能,动态撤销

Implementation/Sample Code_实现/范例代码910

Implementation

Component

public abstract Component {
	public void sampleOperation();
}

ConcreteComponent

public class ConcreteComponent extends Component {
	@Override
	public void sampleOperation() {
		// TODO
	}
}

Decorator

public class Decorator extends Component {
	private Component commponent;

	public Decorator(Component component) {
		this.component = component;
	}
	
	@Override
	public void sampleOperation() {
		commponent.sampleOperation();
	}
}

ConcreteDecorator

public class ConcreteDecoratorA extends Decorator {
	public ConcreteDecoratorA(Component component) {
		super(component);
	}
	
	@Override
	public void sampleOperation() {
		super.sampleOperation();
		// TODO
	}
}
public class ConcreteDecoratorB extends Decorator {
	public ConcreteDecorator(Component component) {
		super(component);
	}

	@Override
	public void sampleOperation() {
		super.sampleOperation();
		// TODO
	}
}

Sample Code

Component

public abstract class Beverage {
    String description = "Unknow Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

ConcreteComponent

public class Espresso extends Beverage {
    public Espresso() {
        description = "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

Decorator

public abstract class CondimentDecorator extends Beverage {
	Beverage beverage;
	
	public CondimentDecorator(Beverage beverage) {
		this.beverage = beverage;
	}
	
    public abstract String getDescription();
}

ConcreteDecorator

public class Whip extends CondimentDecorator {
    public Whip(Beverage beverage) {
        super(beverage);
    }
    
	@Override
    public String getDescription() {
        return beverage.getDescription() + ", Whip";
    }

	@Override
    public double cost() {
        return .10 + beverage.cost();
    }
}
public class Mocha extends CondimentDecorator {
    public Mocha(Beverage beverage) {
		super(beverage);
    }

	@Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

	@Override
    public double cost() {
        return .20 + beverage.cost();
    }
}

Demo

public class CoffeeShop {
    public static void main(String[] args) {
       Beverage espresso = new Espresso();
        System.out.println(espresso.getDescription() + " $" + espresso.cost());

        espresso = new Mocha(espresso);
        espresso = new Whip(espresso);
        System.out.println(espresso.getDescription() + " $" + espresso.cost());
    }
}

Result

Espresso $1.99
Espresso, Mocha, Whip $2.29

Known Uses_已知应用11

Related Patterns_相关模式12


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值