Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

    • 设计模式的概念
    • 创建型模式
    • 单例(Singleton)模式
    • 原型(Prototype)模式
    • 工厂(Factory)模式
    • 建造者(Builder)模式
    • 结构型模式(Structural Pattern)
    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 装饰器模式(Decorator、Wrapper(包装) Pattern)
      • 应用场景
    • 代理模式(Proxy Pattern)
    • 外观模式(Facade Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
    • 行为型模式(Behavioral Patterns)
    • 模板方法(Template Method)
    • 策略(Strategy)模式
    • 状态(State)模式
    • 中介者(Mediator)模式
    • 观察者(Observer)模式
    • 备忘录(Memento)模式
    • 解释器(Interpreter)模式
    • 命令(Command)模式
    • 迭代器(Iterator)模式
    • 访问者(Visitor)模式
    • 职责链(Chain of Responsibility)模式
    • 总结
  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • 设计模式
Iekr
2022-04-22
目录

装饰器模式(Decorator、Wrapper(包装) Pattern)

# 装饰器模式(Decorator、Wrapper(包装) Pattern)

  • 适配器是连接两个类,可以增强一个类,装饰器是增强一个类

  • 向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。

  • 创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

image-20220422171935967

抽象构件(Component)角色:

定义一个抽象接口以规范准备接收附加责任的对象。

/**
 *抽象构件
 */
public interface ManTikTok {
    void tiktok();
}
1
2
3
4
5
6

具体构件(ConcreteComponent)角色:

实现抽象构件,通过装饰角色为其添加一些职责。

public class MiTikTok implements ManTikTok {
    @Override
    public void tiktok() {
        System.out.println("雷军在抖音直播中");
    }
}

1
2
3
4
5
6
7

抽象装饰(Decorator)角色:

继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。

/**
 * 抽象装饰
 */
public interface TiktokDecorator extends ManTikTok{
    void enable();
}
1
2
3
4
5
6

具体装饰(ConcreteDecorator)角色:

实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

/**
 * 装饰器只关心增强这个类的方法
 */
public class MeiYanDecorator implements TiktokDecorator{

    //装饰谁?
    private ManTikTok manTikTok;

    public MeiYanDecorator(ManTikTok manTikTok) {
        this.manTikTok = manTikTok;
    }

    @Override
    public void tiktok() {

        //保留之前的功能
        manTikTok.tiktok();
        //开启增强功能
        enable();
    }

    //定义了增强功能
    @Override
    public void enable() {
        System.out.println("开启推广直播间");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

测试方法

public static void main(String[] args) {
    //被装饰对象
    MiTikTok miTikTok = new MiTikTok();
    miTikTok.tiktok();


    MeiYanDecorator decorator = new MeiYanDecorator(miTikTok);
    decorator.tiktok();
}
1
2
3
4
5
6
7
8
9

# 应用场景

  • 无处不在.....

  • SpringSession 中如何进行 session 与 redis 关联?HttpRequestWrapper

    • session:数据存在了内存

    • session:数据存在 redis

    • HttpSession;getAttribute();

    • Wrapper(session){
      
      getAttribute(String param){    redis.get(param) };
      
      }
      
      1
      2
      3
      4
      5
  • MyBatisPlus 提取了 QueryWrapper,这是什么?

  • Spring 中的 BeanWrapper 是做什么?包装了 Bean。bean 的功能增强?

  • Spring Webflux 中的 WebHandlerDecorator?

  • 已存的类,每一天在某个功能使用的时候发现不够,就可以装饰器。

Java 的 IO 结构,FilterInputStream 就是一个装饰者

image-20231208204250080

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class Decorator {
    public static void main(String[] args) throws Exception {
        // TODOAuto-generated method stub
        //说明
        //1. InputStream 是抽象类, 类似我们前面讲的 Drink
        //2. FileInputStream 是 InputStream 子类,类似我们前面的 DeCaf, LongBlack
        //3. FilterInputStream 是 InputStream 子类:类似我们前面 的 Decorator 修饰者
        //4. DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等
        //5. FilterInputStream 类 有 protected volatile InputStream in; 即含被装饰者
        //6. 分析得出在 jdk 的 io 体系中,就是使用装饰者模式
        DataInputStream dis = new DataInputStream(new FileInputStream("d:\\abc.txt"));
        System.out.println(dis.read());
        dis.close();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02
桥接模式(Bridge Pattern)
代理模式(Proxy Pattern)

← 桥接模式(Bridge Pattern) 代理模式(Proxy Pattern)→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式