前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java设计模式之(七)——装饰器模式

Java设计模式之(七)——装饰器模式

作者头像
IT可乐
发布2021-11-25 16:27:40
2990
发布2021-11-25 16:27:40
举报
文章被收录于专栏:IT可乐IT可乐

1、什么是装饰器模式?

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.

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

说人话:一般的,我们为了扩展一个类经常使用继承方式实现,随着扩展功能的增多,子类会很膨胀。这时候期望在不改变类对象及其类定义的情况下,为对象添加额外功能,这就是装饰器模式。

2、装饰器模式定义

image-20210909082623357
image-20210909082623357

①、Component抽象构件

Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象。

②、ConcreteComponent 具体构件

ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。

③、Decorator装饰角色

一般是一个抽象类, 实现接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的属性里必然有一个private变量指向Component抽象构件。

④、ConcreteDecorator 具体装饰角色

ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 你要把你最核心的、 最原始的、 最基本的东西装饰成其他东西

3、装饰器模式通用代码实现

代码语言:javascript
复制
/**
 * 抽象构件
 */
public abstract class Component {
    public abstract void operator();
}
代码语言:javascript
复制
/**
 * 具体构件
 */
public class ConcreteComponent extends Component{
    @Override
    public void operator() {
        System.out.println("doSomething");
    }
}
代码语言:javascript
复制
/**
 * 抽象装饰者
 */
public abstract class Decorator extends Component{
    private Component component;

    public Decorator(Component component){
        this.component = component;
    }

    // 委托给被修饰者执行
    @Override
    public void operator() {
        this.component.operator();
    }
}
代码语言:javascript
复制
public class ConcreteDecorator1 extends Decorator{
    // 定义被修饰者
    public ConcreteDecorator1(Component component){
        super(component);
    }

    // 定义自己的修饰方法
    public void method1(){
        System.out.println("修饰方法 method1");
    }
    @Override
    public void operator() {
        this.method1();
        super.operator();
    }
}
代码语言:javascript
复制
public class ConcreteDecorator2 extends Decorator{
    // 定义被修饰者
    public ConcreteDecorator2(Component component){
        super(component);
    }

    // 定义自己的修饰方法
    public void method2(){
        System.out.println("修饰方法 method2");
    }
    @Override
    public void operator() {
        super.operator();
        this.method2();
    }
}

客户端测试:

代码语言:javascript
复制
public class DecoratorClient {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        // 第一次修饰
        component = new ConcreteDecorator1(component);
        // 第二次修饰
        component = new ConcreteDecorator2(component);
        // 修饰后运行
        component.operator();
    }
}

打印结果:

image-20210909230652141
image-20210909230652141

4、装饰器模式优点

①、装饰模式可以动态地扩展一个实现类的功能。

②、装饰类和被装饰类可以独立发展, 而不会相互耦合。 换句话说, Component类无须知道Decorator类, Decorator类是从外部来扩展Component类的功能, 而Decorator也不用知道具体的构件。

③、装饰模式是继承关系的一个替代方案。 我们看装饰类Decorator, 不管装饰多少层, 返回的对象还是Component, 实现的还是is-a的关系

5、装饰器模式应用场景

①、需要扩展一个类的功能, 或给一个类增加附加功能。

②、需要动态地给一个对象增加功能, 这些功能可以再动态地撤销。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、什么是装饰器模式?
  • 2、装饰器模式定义
  • 3、装饰器模式通用代码实现
  • 4、装饰器模式优点
  • 5、装饰器模式应用场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档