装饰者模式 (Decorator)
1.网络上的一句话说明
ary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?
2.定义
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。
3.设计原则
① 类应该对扩展开放,对修改关闭
4.举例说明
书上介绍了一个星巴克的列子,java的FilterInputStream也是一个很好的列子
个人觉得使用装饰者模式 可以在运行期间很好的进行组合扩展·但是会有大量的子类产生。
我随便举个列子·吃面·
牛肉面,排骨面,鸡汤面都继承自面 可以理解为一个组件 牛肉,排骨,鸡肉都是装饰者 继承自SeasoningNoodles
public abstract class Noodles
{
//消费
public abstract int cost();
}
public abstract class SeasoningNoodles extends Noodles
{
Noodles noodles;
public SeasoningNoodles(Noodles noodles)
{
this.noodles = noodles;
}
}
public class Beef extends SeasoningNoodles
{
int price;
public Beef(Noodles noodles) {
super(noodles);
// TODO 自动生成构造函数存根
}
@Override
public int cost()
{
return price+noodles.cost();
}
}
//创建一个牛肉面
Noodles noodles = new BeefNoodles();
//放入牛肉 就是用牛肉装饰它 装饰者都继承于SeasoningNoodles
noodles = new Beef(noodles );
//还想要排骨 加入排骨 这里体现装饰者的好处
noodles = new Spareribs(noodles );
//最后计算价钱
noodles.cost();
只列出了部分源码