装饰器模式(Decorator Pattern)

简介: 装饰器模式(Decorator Pattern)

定义


动态地给一个对象添加额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

1671088354957.jpg


代码实现


抽象构件:

public abstract class Component {
    //抽象的方法
    public abstract void operate();
}
复制代码

具体构件:

public class ConcreateComponent extends Component {
    @Override
    public void operate() {
        System.out.println("do something");
    }
}
复制代码

抽象装饰器:

public abstract class Decorator extends Component{
    Component component;
    public Decorator(Component component) {
        this.component = component;
    }
    @Override
    public void operate() {
        this.component.operate();;
    }
}
复制代码

具体装饰类:

public class ConcreteDecorator1 extends Decorator {
    public ConcreteDecorator1(Component component) {
        super(component);
    }
    private void method1() {
        System.out.println("修饰1");
    }
    @Override
    public void operate() {
        this.method1();
        super.operate();
    }
}
public class ConcreteDecorator2 extends Decorator {
    public ConcreteDecorator2(Component component) {
        super(component);
    }
    private void method2() {
        System.out.println("修饰2");
    }
    @Override
    public void operate() {
        super.operate();
        this.method2();
    }
}
复制代码

场景类:

public static void main(String[] args) {
        Component component = new ConcreateComponent();
        //第一次修饰
        component = new ConcreteDecorator1(component);
        //第二次修饰
        component = new ConcreteDecorator2(component);
        component.operate();
    }
复制代码


优点


  • 装饰类和被装饰类独立发展,互补耦合。意思就是Component不知道Decorator存在,Decorator也不用知道具体的构件。
  • 是继承关系的一个替代方案。无论装饰多少层,装饰后依然返回Component。
  • 动态扩展一个实现类的功能,如果不需要,直接不进行装饰,卸载即可。


缺点


多层装饰增加系统的复杂度。


适用场景


  • 需要扩展一个类的功能
  • 动态给一个对象增加功能,也可以动态撤销


实践


装饰模式是对继承的有力补充。但是继承不是动态的,扩展性差。什么意思呢?比如Father, Son, GrandSon三个继承关系类,现在需求要对Son增强功能,难道要修改Son类中增加修改方法吗? 但会影响GrandSon,特别是GrandSon有多个情况, 但是可以通过装饰器模式添加一个SonDecorator来实现,原来的程序不进行变更。

另外JDK源码IO中也用到了装饰器模式。

1671088396584.jpg

抽象构件: InputStream

具体构件: FileInputStream

抽象装饰器: FilterInputStream

具体装饰器: BufferedInputStream, DataInputStream

目录
相关文章
|
设计模式
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
32 0
|
6天前
|
设计模式 Java C#
装饰模式(Decorator Pattern)
装饰模式是一种结构型设计模式,允许在不修改原有对象的情况下动态添加功能。它通过装饰类层层叠加实现功能扩展,适用于需要在运行时动态添加、修改或移除对象行为的场景。装饰模式的核心角色包括抽象组件、具体组件、抽象装饰和具体装饰。该模式的优点在于动态扩展功能、避免类爆炸和遵守开放-封闭原则,但可能会导致对象数量增加和调试困难。常见使用场景包括图形系统中的动态效果和输入流的功能扩展。
26 0
结构型模式 - 装饰器模式(Decorator Pattern)
结构型模式 - 装饰器模式(Decorator Pattern)
|
存储 算法 Java
行为型模式 - 模板模式(Template Pattern)
行为型模式 - 模板模式(Template Pattern)
|
设计模式 自动驾驶
装饰器模式Decorator
煎饼果子装饰器&汽车装饰器
591 3
装饰器模式Decorator
|
设计模式 Java
Java设计模式——装饰模式(Decorator Pattern)
Java设计模式——装饰模式(Decorator Pattern)
209 0
Java设计模式——装饰模式(Decorator Pattern)
|
设计模式 Java 数据库连接
【Java设计模式系列】装饰器模式(Decorator Pattern)(下)
【Java设计模式系列】装饰器模式(Decorator Pattern)
132 0
【Java设计模式系列】装饰器模式(Decorator Pattern)(下)
|
设计模式 Java
【Java设计模式系列】装饰器模式(Decorator Pattern)(上)
【Java设计模式系列】装饰器模式(Decorator Pattern)
145 0
【Java设计模式系列】装饰器模式(Decorator Pattern)(上)
|
设计模式 缓存 Java
结构型-Decorator
装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。
102 0
|
设计模式
装饰器模式(Decorator)
一.装饰者模式的定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 结构: 装饰器UML.png (1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
875 0