最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • (三)装饰者模式 |小册免费学

    正文概述 掘金(小铭子)   2021-04-30   503

    一、装饰者模式是什么

    给对象动态地增加职责的方式称为装饰者(decorator)模式。该模式能够在不改变对象自身的基础上,在程序运行期间给对象动态地添加职责。相比于继承,装饰者是一种更轻便灵活的做法,这是一种“即用即付”的方式。

    我们可以简单理解成:装饰者模式是,在不改变原对象的基础上,通过对其进行包装拓展,灵活组装搭配,使原有对象可以满足用户的多样复杂需求。

    二、为什么需要使用装饰者模式

    我们在平时业务开发中,经常遇到产品经理改需求,加附加功能。如果把所有功能的逻辑实现堆砌到一个函数中,每次小的需求改动,就需要全局修改逻辑。如此一来”牵一发而动全身”肯定是不好的。因此,我们可以把主功能的代码写到主函数,附加功能的独立成单独的函数,产品改动附加功能需求,我们只需改动附加单一函数。这一实现思路便是装饰者模式,这样不仅降低了维护成本,还提高了效率。

    三、实践应用加深理解装饰者模式

    3.1 JavaScript使用装饰者模式

    我们使用装饰者模式,来实现点击按钮弹出“您还未登录哦”的弹窗,并将按钮文案改为“快去登录”,同时将按钮置灰的功能。具体代码如下: html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>按钮点击需求</title>
    </head>
    <style>
        #modal {
            height: 200px;
            width: 200px;
            line-height: 200px;
            position: fixed;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
            border: 1px solid black;
            text-align: center;
        }
    </style>
    <body>
        <button id='open'>点击打开</button>
    </body>
    

    JavaScript逻辑实现:

    // 弹框创建逻辑
    const Modal = (function() {
        let modal = null
        return function() {
            if(!modal) {
                modal = document.createElement('div')
                modal.innerHTML = '您还未登录哦~'
                modal.id = 'modal'
                modal.style.display = 'none'
                document.body.appendChild(modal)
            }
            return modal
        }
    })()
    
    // 将展示Modal的逻辑单独封装
    function openModal() {
        const modal = new Modal()
        modal.style.display = 'block'
    }
    // 按钮文案修改逻辑
    function changeButtonText() {
        const btn = document.getElementById('open')
        btn.innerText = '快去登录'
    }
    // 按钮置灰逻辑
    function disableButton() {
        const btn =  document.getElementById('open')
        btn.setAttribute("disabled", true)
    }
    // 功能逻辑整合
    function changeButtonStatus() {
        changeButtonText()
        disableButton()
    }
    document.getElementById('open').addEventListener('click', function() {
        openModal()
        changeButtonStatus()
    })
    

    上述代码实现,将功能函数拆分,遵循了“单一职责”的原则,增强了代码的可拓展性和可维护性。

    3.2 ES7的装饰器

    ES7使用 @ 语法糖能轻松给一个类装上装饰器,组装功能更加灵活方便。使用代码如下:

    // 装饰器函数,它的第一个参数是目标类
    function classDecorator(target) {
        target.hasDecorator = true
      	return target
    }
    
    // 将装饰器“安装”到Button类上
    @classDecorator
    class Button {
        // Button类的相关逻辑
    }
    
    // 验证装饰器是否生效
    console.log('Button 是否被装饰了:', Button.hasDecorator)
    // output:Button 是否被装饰了:true
    

    由上述代码执行结果来看,ButtonclassDecorator函数装饰了,classDecoratortarget 指向了Button。

    四、总结

    装饰者模式在编码开发中常用的,它的核心思想是“只添加,不修改”。这一设计模式深受开发者喜爱,只用关注自己拓展的新功能模块,旧的逻辑基本保持不变。如此一来,开发者便少背锅啦~

    本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情


    起源地下载网 » (三)装饰者模式 |小册免费学

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元