【玩转23种Java设计模式】结构型模式篇:装饰者模式

2022-05-12 10:49:52 浏览数 (2)

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

文章目录
  • 一、简介
  • 二、实例
    • 1、抽象被装饰者(Component)
    • 2、具体被装饰者(ConcreteComponent)
    • 3、抽象装饰者(Decorator)
    • 4、具体装饰者(ConcreteDecorator)
    • 5、Main
  • 三、总结
    • 1、优点
    • 2、缺点
    • 3、应用场景

一、简介

  装饰者模式(Decorator Pattern)是一种比较常见的模式,其定义如下:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。   它的主要组成部分:抽象被装饰者、具体被装饰者、抽象装饰者、具体装饰者。

二、实例

1、抽象被装饰者(Component)

代码语言:javascript复制
public abstract class Component {
    public abstract void operate();
}

2、具体被装饰者(ConcreteComponent)

代码语言:javascript复制
public class ConcreteComponent extends Component {
    @Override
    public void operate() {
        System.out.println("应该做一些事情");
    }
}

3、抽象装饰者(Decorator)

代码语言:javascript复制
public class Decorator extends Component {
    private Component component = null;
    
    public Decorator(Component component){
        this.component = component;
    }

    @Override
    public void operate() {
        this.component.operate();
    }
}

4、具体装饰者(ConcreteDecorator)

代码语言:javascript复制
public class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component){
        super(component);
    }

    private void method(){
        System.out.println("修饰方法执行了");
    }

    @Override
    public void operate() {
        this.method();
        super.operate();
    }
}

5、Main

代码语言:javascript复制
public class Main {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        component = new ConcreteDecorator(component);
        component.operate();
    }
}

控制台输出:

代码语言:javascript复制
修饰方法执行了
应该做一些事情

三、总结

1、优点

  • 装饰者类和被装饰类可以独立发展,而不会相互耦合。
  • 装饰模式是继承关系的一个替代方案。

2、缺点

  • 多层的装饰是比较复杂的,尽量减少装饰类的数量,以便降低系统的复杂度。

3、应用场景

  • 需要扩展一个类的功能,或给一个类增加附加功能。
  • 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
  • 需要为一批兄弟类进行改装或加装功能,当然是首选装饰模式。

0 人点赞