介绍
* 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
* 它是通过创建一个包装对象,也就是装饰来包裹真实的对象
优点
* 可以为已有功能动态地添加上其他新功能
* 比继承更多的灵活性
* 把类中的装饰功能从类中移除出去,让类简化,是类的核心逻辑和装饰功能分开
* 通过使用不同的 具体装饰类 以及这些装饰类的[排列组合],设计师可以创造出很多 [不同行为的组合]
缺点
* 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂
* 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适
使用场景
以下情况使用Decorator模式
* 需要扩展一个类的功能,或给一个类添加附加职责
* 需要动态的给一个对象添加功能,这些功能可以再动态的撤销
* 当不能采用生成子类的方法进行扩充时
1. 一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
2. 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
入门案例:
UML图解:
代码:
[Component]
person:
public interface Person {
void doSomething(); //做些事情
}
[ConcreteComponent ]
Man:
public class Man implements Person {
private void eat(){
System.out.println("吃饭");
}
@Override
public void doSomething() {
eat();
}
}
[Decorator]
Decorator:
//一个装饰器抽象类
public abstract class Decorator implements Person {
protected Person person;
public Decorator(Person person){
this.person = person;
}
@Override
public void doSomething() {
if (person != null)
person.doSomething();
}
}
[ConcreteDecorator]
WatchTV_Decorator:
public class WatchTV_Decorator extends Decorator {
public WatchTV_Decorator(Person person) {
super(person);
}
@Override
public void doSomething() {
System.out.println("看电视");
super.doSomething();
}
}
Somke_Decorator
public class Smoke_Decorator extends WatchTV_Decorator {
public Smoke_Decorator(Person person) {
super(person);
}
@Override
public void doSomething() {
super.doSomething();
System.out.println("抽烟");
}
}
测试:
public class Main {
public static void main(String[] args){
Person man = new Man();
//情况1:这个男人想做什么呢
// man.doSomething();
/**
* output:
* 吃饭
*/
//情况2:这个男人想在吃饭前看看电视
// Decorator watchTV_decorator = new WatchTV_Decorator(man);
// watchTV_decorator.doSomething();
/**
* output:
* 看电视
* 吃饭
*/
//情况3:这个男人想在吃饭前看看电视切吃完饭还想抽烟
Decorator smoke_decorator = new Smoke_Decorator(man);
smoke_decorator.doSomething();
/**
* output:
* 看电视
* 吃饭
* 抽烟
*/
}
}