Java设计模式(九)装饰者模式

栏目: 后端 · 发布时间: 6年前

内容简介:装饰者模式 (Decorator Pattern) 在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。动态的给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。

装饰者模式 (Decorator Pattern) 在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰者模式

动态的给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。

Java设计模式(九)装饰者模式

一般来说装饰者模式有下面几个参与者:

(1) Component:装饰者和被装饰者共同的父类,是一个接口或者抽象类,用来定义基本行为。

(2) ConcreteComponent:定义具体对象,即被装饰者。

(3) Decorator:抽象装饰者,继承自 Component ,从外类来扩展 ConcreteComponent 。对于 ConcreteComponent 来说,不需要知道 Decorator 的存在,Decorator 是一个接口或抽象类

(4) ConcreteDecorator:具体装饰者,用于扩展 ConcreteComponent 。

1、抽象构件角色 Component

public interface Component {
    public void sampleOperation();
}

2、具体构件角色 ConcreteComponent

public class ConcreteComponent implements Component {
    @Override
    public void sampleOperation() {
        System.out.println("ConcreteComponent.sampleOperation()");
    }
}

3、装饰角色 Decorator

public class Decorator implements Component {
    Component component;

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

    @Override
    public void sampleOperation() {
        // 委派给构件
        component.sampleOperation();
    }
}

4、具体装饰角色 ConcreteDecorator

public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    @Override
    public void sampleOperation() {
        System.out.println("ConcreteDecoratorA.sampleOperation() start");
        super.sampleOperation();
        System.out.println("ConcreteDecoratorA.sampleOperation() end");
    }
}
public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }
    @Override
    public void sampleOperation() {
        System.out.println("ConcreteDecoratorB.sampleOperation() start");
        super.sampleOperation();
        System.out.println("ConcreteDecoratorB.sampleOperation() end");
    }
}

5、装饰者模式的使用

public class DecoratorMain {
    public static void main(String[] args) {

        ConcreteComponent concreteComponent = new ConcreteComponent();
        ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(concreteComponent);
        concreteDecoratorA.sampleOperation();
        ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(concreteComponent);
        concreteDecoratorB.sampleOperation();

    }
}

装饰者模式的优缺点:

优点:装饰模式可以提供比继承更多的灵活性;通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难。

本文实现源码: https://github.com/wshunli/design-patterns/tree/master/src/ch09

参考资料

1、学习、探究 Java 设计模式——装饰者模式 - CSDN博客

https://blog.csdn.net/a553181867/article/details/52108423

2、Java设计模式之装饰者模式(Decorator pattern) - 简书

https://www.jianshu.com/p/c26b9b4a9d9e

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 Java设计模式(九)装饰者模式 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。

本文链接: https://www.wshunli.com/posts/d95b685e.html


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

迎接互联网的明天

迎接互联网的明天

邹静 / 电子工业 / 2011-6 / 55.00元

《迎接互联网的明天-玩转3D Web(附盘)》,全书共5章,第1章主要阐述了国内外空前繁荣的3D互联网技术领域,以及这些领域透射出来的潜在商机;第2章主要用当下比较流行的Flash编程语言ActionScript 3,来向大家介绍面向对象编程语言的思想概念,以及一些3D渲染技术的入门知识;第3章注重建模知识的运用,主要运用WireFusion和3ds Max来制作3D网页;第4章主要介绍3D游戏编......一起来看看 《迎接互联网的明天》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具