码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 设计模式---装饰者模式


    定义:
    在不改变原有对象的基础之上,将功能附加到对象上
    提供了比继承更加有弹性的替代方案(扩展原有对象功能)
    适用场景:
    扩展一个类的功能或给一个类添加附加职责
    动态的给一个对象添加功能,这些功能可以再动态的撤销
    优点:
    继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能
    通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果
    符合开闭原则
    缺点:
    会出现更过的代码,更多的类,增加程序复杂性
    动态装饰时,多层装饰会更复杂
    相关设计模式
    装饰者模式和代理模式
    装饰者模式和适配器模式

    Coding
    煎饼加鸡蛋加香肠的场景

    public abstract class ABattercake {
    
        protected abstract String getDesc();
    
        protected abstract int cost();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    public class Battercake extends ABattercake {
        @Override
        protected String getDesc() {
            return "煎饼";
        }
    
        @Override
        protected int cost() {
            return 8;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    public abstract class AbstractDecorator extends ABattercake {
    
        private ABattercake aBattercake;
    
        public AbstractDecorator(ABattercake aBattercake) {
            this.aBattercake = aBattercake;
        }
    
        @Override
        protected String getDesc() {
            return this.aBattercake.getDesc();
        }
    
        @Override
        protected int cost() {
            return this.aBattercake.cost();
        }
    
        protected abstract void doSomething();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    public class EggDecorator extends AbstractDecorator {
    
    
        public EggDecorator(ABattercake aBattercake) {
            super(aBattercake);
        }
    
        @Override
        protected String getDesc() {
            return super.getDesc() + "加一根鸡蛋";
        }
    
        @Override
        protected int cost() {
            return super.cost() + 1;
        }
    
        @Override
        protected void doSomething() {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    public class SausageDecorator extends AbstractDecorator {
    
    
        public SausageDecorator(ABattercake aBattercake) {
            super(aBattercake);
        }
    
        @Override
        protected String getDesc() {
            return super.getDesc() + "加一根香肠";
        }
    
        @Override
        protected int cost() {
            return super.cost() + 2;
        }
    
        @Override
        protected void doSomething() {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    public class Test {
    
        public static void main(String[] args) {
            ABattercake aBattercake;
            aBattercake = new Battercake();
            aBattercake = new EggDecorator(aBattercake);
            aBattercake = new EggDecorator(aBattercake);
            aBattercake = new SausageDecorator(aBattercake);
            System.out.println(aBattercake.getDesc() + " 销售价格:" + aBattercake.cost());
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    JDK中BufferReader.java、BufferedInputStream.java的实现
    Spring中TransactionAwareCacheDecorator.java的实现
    Mybatis中org.apache.ibatis.cache.Cache同级的decorators包内都是对Cache的装饰类

  • 相关阅读:
    Linux操作文档——pt-osc工具
    Unity 3D Input System的使用
    【拖拖拖没烦恼;难难难睡不着】22届错过校招未就业|什么是校招?二本进不去大厂,校招不重要?
    Git小乌龟(TortoiseGit) 简单提交代码到github
    MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口
    项目管理工具dhtmlxGantt甘特图入门教程(四):用HTML作为内部视图及相关设置
    Fiddle日常运用手册(2)-使用过滤器进行接口精准拦截
    k8s部署手册-v06
    52-C语言-文件问题-把字符串中的小写字母变为大写字母,并输出到磁盘文件“test”中,输入的字符串以‘!’结束
    Arm Neoverse 路线图再添新品,基于四项关键原则打造
  • 原文地址:https://blog.csdn.net/qq_36364521/article/details/125877257
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号