• 重学设计模式之 装饰者模式


    装饰者设计模式

    1.定义

    在不改变原有对象的基础之上,将功能附加到对象上

    1.1 特点

    ​ 提供了比继承更有弹性的替代方案(扩展原有对象功能)

    1.2 类型 : 结构型

    2.适用场景

    ​ 1、扩展一个类的功能或给一个类添加附加职责

    ​ 2、动态的给一个对象添加功能,这些功能可以再动态的撤销

    3.缺点

    1.会出现更多的代码,更多的类,增加程序复杂性

    2.动态装饰时 多层装饰时会更复杂

    4.优点

    1.继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能

    2.通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果

    3.符合开闭原则

    5.装饰者-相关的设计模式

    装饰者模式和代理模式

    装饰者模式和适配器模式

    外观模式和抽象工厂模式

    编写代码

    1. 简单代码 具体代码去本文下方的 代码地址
    package com.zw.design.pattern.creational.structural.decorator.v2;
    public abstract class ABattercake {
        protected String getDesc(){
            return null;
        }
        protected int cost(){
            return 0;
        }
    }
    package com.zw.design.pattern.creational.structural.decorator.v2;
    
    public class Battercake extends ABattercake {
        protected String getDesc(){
            return "武大郎煎饼";
        }
        protected int cost(){
            return 9;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.编写装饰者聚合类

    package com.zw.design.pattern.creational.structural.decorator.v2;
    
    /****
     * 装饰者聚合类
     * 是否是抽象类 需要看具体业务
     */
    public abstract class AbstractDecorator extends ABattercake {
    
        private ABattercake aBattercake;
    
        public AbstractDecorator(ABattercake aBattercake){
            this.aBattercake=aBattercake;
        }
        //如果是抽象方法 子类必须去重写改方法
        public abstract  void doSingle();
    
    
        @Override
        protected String getDesc() {
            return this.aBattercake.getDesc();
        }
    
        @Override
        protected int cost() {
            return this.aBattercake.cost();
        }
    }
    
    
    
    • 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
    • 28
    • 29

    3.具体实现类

    package com.zw.design.pattern.creational.structural.decorator.v2;
    
    public class EggDecorator  extends AbstractDecorator{
    
        public EggDecorator(ABattercake aBattercake) {
            super(aBattercake);
        }
    
        @Override
        public void doSingle() {
    
        }
    
        @Override
        protected String getDesc() {
            return super.getDesc()+"加一个煎蛋";
        }
    
        @Override
        protected int cost() {
            return super.cost()+1;
        }
    }
    //第二个类
    package com.zw.design.pattern.creational.structural.decorator.v2;
    
    public class SausageDecorator extends AbstractDecorator{
        public SausageDecorator(ABattercake aBattercake) {
            super(aBattercake);
        }
    
        @Override
        public void doSingle() {
    
        }
    
        @Override
        protected String getDesc() {
            return super.getDesc()+" 加入一根火腿";
        }
    
        @Override
        protected int cost() {
            return super.cost()+3;
        }
    }
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    4.测试

    package com.zw.design.pattern.creational.structural.decorator.v2;
    
    public class TestMain {
        public static void main(String[] args) {
          ABattercake aBattercake;
          aBattercake=new Battercake();
          //加鸡蛋
          aBattercake=new EggDecorator(aBattercake);
          //加火腿
          aBattercake=new SausageDecorator(aBattercake);
          aBattercake=new EggDecorator(aBattercake);
    
            System.out.println("aBattercake = " + aBattercake.getDesc()+" 价格 "+aBattercake.cost());
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ulm 设计图
    在这里插入图片描述
    测试结果
    在这里插入图片描述
    框架源码解析

    在spring框架当中TransactionAwareCacheDecorator 该类主要目的是提高缓存和事务之间的同步级别

    在这里插入图片描述
    在mybatis 当中使用装饰者模式应用为FifoCache
    在这里插入图片描述
    代码如下

  • 相关阅读:
    手写数据库连接池
    jQuery
    【微积分】算法数学基础之微积分
    【RocketMQ】事务的实现原理
    Docker+nginx在CVM的机器远程发布hellogin
    js基础笔记学习315练习1
    【干货技巧】最新 Java 后端面试系列干货,都在这了!
    一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
    Yolov8小目标检测(23):多分支卷积模块RFB,扩大感受野提升小目标检测精度
    Python中__init__.py的作用介绍
  • 原文地址:https://blog.csdn.net/qq_32048567/article/details/126004929