我学会了,装饰器模式

简介: 装饰器模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。

前言

装饰器模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。

装饰器模式

使用场景:动态追加或者撤销功能,一般是给class扩展新功能,面向切面编程也是装饰器模式的体现。

理解:类、对象的结构和使用解耦,装饰器模式很好的诠释了动态功能追加,但是前提是功能接口得一致,这样看起来才是对功能得扩展。综上所见应该是动态的借用,然后暴露对外一致的接口,最后调用这个接口即可,这个借用的操作可以一直叠加,从而实现了无上限的装饰下去。比如ts中的装饰器又叫注解,给类加上注解就会扩展类的功能,给方法加上注解就会扩展方法的功能。ts的装饰器,给类扩展应该是在类的原型上做手脚,而给方法扩展应该是改写了原有方法,用新的方法替换旧方法。


namespace struct_mode_03 {

    // 接口
    interface IPhone {
        run(): void;

    }

    // 产品类
    class HongMiK30 implements IPhone {

        run(): void {
            console.log('运行红米K30手机')
        }
    }

    // 装饰器
    class PhoneDecorator implements IPhone {

        phoneDecorator: IPhone

        constructor(phoneDecorator: IPhone) {
            this.phoneDecorator = phoneDecorator
        }

        run(): void {
            this.phoneDecorator.run()
        }
    }

    // 实体的装饰类
    class FanPhoneDecorator extends PhoneDecorator {

        constructor(phone: IPhone) {
            super(phone)
        }

        run() {
            super.run()
            this.runFan()
        }

        runFan() {
            console.log('安装手机电风扇,运行手机电扇')
        }
    }

    // 实体的装饰类
    class MemoryPhoneDecorator extends PhoneDecorator {

        constructor(phone: IPhone) {
            super(phone)
        }

        run() {
            this.runMemory()
            super.run() // ! 这里是super 不是 this
        }

        runMemory() {
            console.log('硬件升级,加大内存')
        }

    }


    // 使用 一:尝试一下功能的追加
    {
        const hongMiK30 = new HongMiK30()

        const homeMiK30DecorateFan = new FanPhoneDecorator(hongMiK30)
        const homeMiK30DecorateMemory = new MemoryPhoneDecorator(hongMiK30)

        console.log('hongMiK30')
        hongMiK30.run()

        console.log('homeMiK30DecorateFan')
        homeMiK30DecorateFan.run()

        console.log('homeMiK30DecorateMemory')
        homeMiK30DecorateMemory.run()
    }

    // 使用 二:动态的追加功能 面向对象
    {
        const hongMiK30 = new HongMiK30()

        const homeMiK30DecorateFan = new FanPhoneDecorator(hongMiK30)
        const homeMiK30DecorateMemory = new MemoryPhoneDecorator(homeMiK30DecorateFan)

        console.log('homeMiK30DecorateMemory')
        homeMiK30DecorateMemory.run()
    }

    // 使用三:动态的追加功能 AOP

    {
        type fnProtoTypeExpression = {
            addBeforeFn(fn: Function): fnProtoTypeExpression,
            addAfterFn(fn: Function): fnProtoTypeExpression,
        }

        const fnProtoType: fnProtoTypeExpression = Function.prototype as unknown as fnProtoTypeExpression

        fnProtoType.addBeforeFn = function (boforeFn: Function) {
            const that = this as unknown as Function;

            return function (...args: any) {
                boforeFn(...args)
                return that(...args)
            } as unknown as fnProtoTypeExpression
        }

        fnProtoType.addAfterFn = function (afterFn: Function) {
            const that = this as unknown as Function;

            return function (...args: any) {
                const result = that(...args)
                afterFn(...args)
                return result
            } as unknown as fnProtoTypeExpression
        }

        const callMethods1 = function callMethods1() {
            console.log('调用 callMethods1')
        } as unknown as fnProtoTypeExpression

        const callMethods2 = function callMethods2() {
            console.log('调用 callMethods2')
        } as unknown as fnProtoTypeExpression

        const callMethods3 = function callMethods3() {
            console.log('调用 callMethods3')
        } as unknown as fnProtoTypeExpression

        (callMethods2
            .addBeforeFn(callMethods1 as unknown as Function)
            .addAfterFn(callMethods3 as unknown as Function) as unknown as Function)()
    }

}
目录
相关文章
|
机器学习/深度学习 人工智能 文字识别
CRNN文字识别
近几年来,CRNN在计算机视觉文本识别领域取得不错成果。CRNN是一种卷积循环神经网络结构,用于解决基于图像的序列识别问题,特别是场景文字识别问题。CRNN网络实现了不定长验证结合CNN和RNN网络结构,使用双向LSTM循环网络进行时序训练,并在最后引入CTC损失函数来实现端对端的不定长序列识别,
1332 0
CRNN文字识别
|
7月前
|
人工智能 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.4 应用实践之 AI大模型外脑
PolarDB向量数据库插件通过实现通义大模型AI的外脑,解决了通用大模型无法触达私有知识库和产生幻觉的问题。该插件允许用户将新发现的知识和未训练的私有知识分段并转换为向量,存储在向量数据库中,并创建索引以加速相似搜索。当用户提问时,系统将问题向量化并与数据库中的向量进行匹配,找到最相似的内容发送给大模型,从而提高回答的准确性和相关性。此外,PolarDB支持多种编程语言接口,如Python,使数据库具备内置AI能力,极大提升了数据处理和分析的效率。
288 4
|
9月前
|
监控 网络协议 网络安全
恶意代码分析入门--开始动态地分析恶意程序(chapter3L_Lab03-01)
实验3-1:通过动态分析技术分析Lab03-01.exe中的恶意代码,探究其导入函数、字符串列表、感染特征及网络特征。实验环境为Windows XP SP3,使用Process Explorer、Strings、Process Monitor、PEiD、Wireshark等工具。分析过程中发现恶意代码创建了互斥体、修改了注册表以实现自启动,并尝试访问外部恶意链接。
215 3
恶意代码分析入门--开始动态地分析恶意程序(chapter3L_Lab03-01)
|
10月前
|
人工智能 运维 测试技术
工作上个的好搭子——通义灵码测评分享
作为一名运维开发工程师,我使用通义灵码的@workspace和@terminal功能,快速熟悉新项目代码并实现新需求。相比之前,提效了约50%。本文分享了我的使用体验和心得,详细介绍了通义灵码如何帮助我在复杂项目中提高开发效率、降低学习成本、提升代码质量和增强团队协作。
|
11月前
|
人工智能 自然语言处理 数据挖掘
文档智能 & RAG让AI大模型更懂业务
《文档智能 & RAG让AI大模型更懂业务》解决方案基于阿里云的文档智能解析与检索增强生成技术,实现非结构化文档向结构化信息的转化,提升AI在特定领域问答的能力。方案提供了详尽的部署指南,包括文档处理、知识库构建等步骤,确保新手也能轻松上手。部署体验良好,未遇重大问题,但建议增加故障排除指南。体验中,LLM知识库展现出高准确率和响应速度,尤其适合处理专业查询。该方案适用于客户服务、知识管理和数据分析等场景,满足生产环境需求,但对于小型企业需考虑成本效益。建议阿里云提供多规模解决方案及定制化选项,以适应不同需求。
158 10
|
10月前
|
监控 Java 开发者
Java虚拟机(JVM)深度优化指南####
本文深入探讨了Java虚拟机(JVM)的工作原理及其性能优化策略,旨在帮助开发者通过理解JVM的内部机制来提升Java应用的运行效率。不同于传统的技术教程,本文采用案例分析与实战技巧相结合的方式,为读者揭示JVM调优的艺术。 ####
303 8
|
机器学习/深度学习 人工智能 算法
探索软件测试的前沿技术:AI与自动化的融合
在数字化时代的浪潮中,软件测试领域正经历着前所未有的变革。本文深入探讨了人工智能(AI)和自动化技术如何重塑软件测试的未来。通过分析最新的行业报告、案例研究和专家访谈,我们揭示了这些技术如何提升测试效率、准确性和灵活性。文章还讨论了实施这些技术的可能挑战和解决方案,为读者提供了宝贵的行业见解和实用建议。
430 33
|
11月前
|
物联网 数据中心
以太网媒体标准详解
【10月更文挑战第16天】
351 0
|
机器学习/深度学习 数据采集 Java
我深度学习0基础,还训练出一个识别验证码模型!
我深度学习0基础,还训练出一个识别验证码模型!
653 0
我深度学习0基础,还训练出一个识别验证码模型!
|
Linux 开发工具 数据安全/隐私保护
【Deepin 20 系统】error:driver pcspkr is already registered aborting
解决Deepin 20系统启动时遇到的“error: driver pcspkr is already registered aborting”错误的方法,通过在GRUB引导加载器中临时更改启动选项进入多用户文本模式,并在系统中创建一个黑名单文件来禁用pcspkr驱动。
632 2