装饰者模式
1 定义
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
2 模式的结构
抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
解释
装饰类和装饰的对象其实是需要实现同样的接口,然后让被装饰者通过组合的方式设置到装饰类中
3 代码
1.有一个鸭子,他会说话
public interface DuckStudy {
void study();
}
class Duck implements DuckStudy {
@Override
public void study() {
System.out.println("我会嘎嘎嘎啦");
}
}
2.过了几天又学会了fly的功能,于是你请朋友帮忙添加这个功能,但是你朋友担心直接修改Duck内部会有影响,于是使用了装饰者模式来实现
public abstract class Decorator implements DuckStudy {
protected DuckStudy duckStudy;
public Decorator(DuckStudy duckStudy) {
this.duckStudy = duckStudy;
}
@Override
public void study() {
duckStudy.study();
}
}
class DuckDecorator extends Decorator{
public DuckDecorator(DuckStudy duckStudy) {
super(duckStudy);
}
@Override
public void study() {
super.study();
//我现在又学会了一个功能
addFly();
}
private void addFly() {
System.out.println("我学会了一个新技能---我会飞啦");
}
}
3.测试
public class TestDemo {
public static void main(String[] args) {
Duck duck = new Duck();
DuckDecorator duckDecorator = new DuckDecorator(duck);
duckDecorator.study();
}
}
4 结果
我会嘎嘎嘎啦
我学会了一个新技能---我会飞啦
4 优缺点和使用场景
4.1 优点
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
4.2 缺点
多层装饰比较复杂。
4.3 使用场景
-
1、扩展一个类的功能。
-
2、动态增加功能,动态撤销。就是主要为了方便扩展。在一个类在扩展功能时,如果通过继承的方式扩展,随着功能增加越来越多时,就会导致子类爆炸。