详解设计模式:装饰器模式

2022-12-02 08:31:46 浏览数 (1)

装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式。装饰器模式 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。 装饰器模式 的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能 ~ 本篇内容包括:关于装饰器模式、装饰器实现 Demo


文章目录
  • 一、关于装饰器模式
    • 1、关于装饰器模式
    • 2、关于装饰器模式的构成
    • 3、关于装饰器模式的UML
    • 4、关于装饰器模式的优缺点
    • 5、装饰器模式、代理模式之间的区别

  • 二、装饰器实现 Demo
    • 1、Demo 实现
    • 2、Demo 测试

一、关于装饰器模式

1、关于装饰器模式

装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式。

装饰器模式 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。

装饰器模式 的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能

2、关于装饰器模式的构成

适配器模式一般包含四种角色:

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
3、关于装饰器模式的UML
4、关于装饰器模式的优缺点

# 装饰器模式的优点

  • 功能扩展灵活,而不依赖继承;
  • 可以对同一个对象进行多种装饰;

# 装饰器模式的缺点

装饰方式可能比较复杂,如果嵌套太多,容易造成代码可读性变差和出错。

5、装饰器模式、代理模式之间的区别

对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口,他们之间的边界确实比较模糊,两者都是对类的方法进行扩展,具体区别如下:

  1. 装饰器模式强调的是增强自身,在被装饰之后你能够在被增强的类上使用增强后的功能。增强后你还是你,只不过能力更强了而已;代理模式强调要让别人帮你去做一些本身与你业务没有太多关系的职责(记录日志、设置缓存)。代理模式是为了实现对象的控制,因为被代理的对象往往难以直接获得或者是其内部不想暴露出来。
  2. 装饰模式是以对客户端透明的方式扩展对象的功能,是继承方案的一个替代方案;代理模式则是给一个对象提供一个代理对象,并由代理对象来控制对原有对象的引用;

二、装饰器实现 Demo

1、Demo 实现

# Component 抽象构件角色

代码语言:javascript复制
interface Component {
    public void operation();
}

# ConcreteComponent 具体构件角色

代码语言:javascript复制
class ConcreteComponent implements Component {
    public ConcreteComponent() {
        System.out.println("创建具体构件角色");
    }
 
    public void operation() {
        System.out.println("调用具体构件角色的方法operation()");
    }
}

# Decorator 抽象装饰角色

代码语言:javascript复制
abstract class Decorator implements Component {
    private Component component;
 
    public Decorator(Component component) {
        this.component = component;
    }
 
    public void operation() {
        component.operation();
    }
}

# ConcreteDecorator 具体装饰角色

代码语言:javascript复制
class ConcreteDecorator extends Decorator {
  
    public ConcreteDecorator(Component component) {
        super(component);
    }
 
    public void operation() {
        super.operation();
        addedFunction();
    }
 
    public void addedFunction() {
        System.out.println("为具体构件角色增加额外的功能addedFunction()");
    }
}
2、Demo 测试
代码语言:javascript复制
public class Client {
    public static void main(String[] args) {
        Component p = new ConcreteComponent();
        p.operation();
       
        Component d = new ConcreteDecorator(p);
        d.operation();
    }
}

0 人点赞