装饰器模式(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

目录
相关文章
|
C++ Python Java
Java每日一练(20230501) 路径交叉、环形链表、被围绕的区域
Java每日一练(20230501) 路径交叉、环形链表、被围绕的区域
178 0
Java每日一练(20230501) 路径交叉、环形链表、被围绕的区域
|
算法 Java C++
【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】
【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】
|
XML Java Maven
IDEA创建Spring项目时没有Spring Config的XML文件
IDEA创建Spring项目时没有Spring Config的XML文件
1230 0
|
Ubuntu Linux 虚拟化
【阿里云镜像】使用阿里云镜像站NTP服务搭建NTP服务器(基于CentOS 7系统)
网络时间协议(Network Time Protocol,NTP)服务器,也就是日常所说的NTP服务器,用来提供同步时间服务。在生产环境中,很多人都会忽略时间问题,实际上服务器、网络设备等,特别是Linux操作系统和虚拟化平台的时间不同步会导致很多问题。那么搭建一台NTP服务器就非常重要,生产环境中的设备可以直接与NTP服务器进行时间同步,NTP服务器本身也可以访问互连的NTP服务器进行同步。NTP服务器可以是物理服务器,也可以是虚拟机。
2228 0
【阿里云镜像】使用阿里云镜像站NTP服务搭建NTP服务器(基于CentOS 7系统)
|
Python
python第三方类库locust压力测试
python第三方类库locust压力测试
247 0
python第三方类库locust压力测试
|
存储 缓存 NoSQL
SpringBoot 项目接入 Redis 集群
Hello 大家好,我是鸭血粉丝,Redis 想必大家一定不会陌生,平常工作中或多或少都会用到,不管是用来存储登录信息还是用来缓存热点数据,对我们来说都是很有帮助的。但是 Redis 的集群估计并不是每个人都会用到,因为很多业务场景或者系统都是一些简单的管理系统,并不会需要用到 Redis 的集群环境。
2050 0
|
移动开发 监控 前端开发
从淘汰边缘到阿里资深前端技术专家,他总结了 8 点
作者 | 梓骞 思维方式直接决定了一个人在工作上的效能和产出。经验是个人对过往项目的总结和处理方式优化。今天的文章来自于阿里工程师梓骞,从大学第一次接触动态网页到现在的资深前端技术专家,他分享了那些人生中的“大事”,让我们看到他是如何一步步转变思维方式,积累经验,升级打怪。
2582 0
从淘汰边缘到阿里资深前端技术专家,他总结了 8 点
|
JavaScript 前端开发
jquery datetimepicker日期时间控件
(function($) { $(function() { $.datepicker.
1589 0
|
Linux
linux watchdog demo hacking
/********************************************************************** * linux watchdog demo hacking * 说明: * 本文主要解析linux watchdog大概应该如何操作。
960 0
|
3天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)

热门文章

最新文章