装饰者模式
概述
动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。
解决的问题
在原有的基础上扩充的类的功能,完成原有类所不能完成的功能。
模式比喻
以饮料为主体(咖啡),如果顾客想要摩卡和奶泡咖啡,那么要做的是:
1.拿一个咖啡对象
2.以摩卡对象装饰它
3.以奶泡对象装饰它
4.调用cost方法,并依赖费托将摩卡、奶泡价钱加上去
描述
//抽象饮料
public abstract class Beverage{
}
//实现的某种饮料
public class Espresso extends Beverage{
}
//装饰者 抽象的
public abstract class CondimentDecorator extends Beverage{
}
//实现具体的装饰者
public class Mocha extends CondimentDecorator{
Beverage beverage;//维持一个被装饰者的引用
//添加新的操作方法
...
}
Java中的实现
Java中的I/O流就是使用的装饰者模式,FileInputStream(被装饰的组件),BufferedInputStream(修饰者),修饰者继承自FilterInputStream,而FilterInputStream和FileInputStream都继承自InputStream。也就是抽象组件和被修饰组件都要继承一个共同的接口,保证使用方便。
缺点
1.造成设计中有大量的小类
2.依赖特定的类型
3.实例化组件,还要包装进装饰者中。