JS 设计模式(2)-- 复习

本文介绍了几种常见的设计模式在JavaScript中的应用,包括策略模式用于封装和替换不同算法,代理模式用于控制对象访问,观察者模式实现对象间的依赖和自动更新,以及发布订阅模式作为解耦合的观察者模式。这些模式能提高代码的可维护性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

策列模式

代理模式

观察者模式

发布订阅模式

模块模式


策列模式

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的用户,策列模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委托给不同的对象进行算法管理

    let startgry = {
        's': salary => salary * 5,
        'a': salary => salary * 4,
        'b': salary => salary * 3,
        'c': salary => salary * 2
    }
    function calBonus(level, salary) {
        // if (level == 'a') {
        //     return salary * 4
        // }
        // if (level == 'b') {
        //     return salary * 3
        // }
        // if (level == 'c') {
        //     return salary * 2
        // }
        return startgry[level](salary)
    }

    console.log(calBonus('a', 3000));

该模式主要解决多种算法相似的情况下,使用if...else所带来的复杂和难以维护,他的优点是算法可以自由切换,同时可以避免多重if else 判断 且具有良好的扩展性       

代理模式

代理模式,为其他对象提供一种代理,以控制这个对象的访问

代理模式使得代理对象控制具体对象的引用,代理几乎可以是任何对象,文件,资源,内存中的对象,或者是一些难以复杂的东西

class Star {
        play() {
            console.log('演戏');
        }
    }
    class StarProxy {
        constructor() {
            this.superStar = new Star()
        }
        talk(price) {
            if (price >= 10000) {
                this.superStar.play()
            } else {
                throw new Error{ '价格不合适' }
            }
        }
    }

es6的proxy

 let star = {
        name: 'zs',
        workPrice: 10000
    }
    let proxy = new Proxy(star, {
        get(target, key) {
            if (key == 'workPrice') {
                console.log('访问了');
            }
            return target[key]
        },
        set(target, key, value) {
            if (key == 'workPrice') {
                console.log('设置了');
                if (value >= 10000) {
                    console.log('可以合作');
                } else {
                    throw new Error('价格不合适')
                }
            }
        }
    })
    console.log(proxy.workPrice = 10000);

观察者模式

观察者模式包含目标和观察者对象两类对象

一个目标可以有任意数目的与之相依赖的观察者

一旦观察目标的状态发生改变,所有观察者都将得到通知

当一个对象的状态发生改变时,所有依赖它的对象都将得到通知并被自动更新,解决了主体对象与观察者之间功能的耦合,即一个对象状态改变给其他对象通知的问题

  // 被观察目标
    class Subject {
        constructor() {
            this.observer = []
        }
        add(observer) {
            this.observer.push(observer)
        }
        ontify() {
            this.observer.forEach(item => {
                item.update()
            })
        }
        remove(observer) {
            this.observer = this.observer.filter(item => item != observer)
        }
    }
    // 观察者
    class Observer {
        constructor(name) {
            this.name = name
        }
        update() {
            console.log('update', this.name);
        }
    }
    let subject = new Subject()
    let observer1 = new Observer('zs')
    let observer2 = new Observer('ls')
    subject.add(observer1)
    subject.add(observer2)
    subject.ontify()
    subject.remove(observer2)
    subject.ontify()
  • 优势:目标与观察者,功能耦合度降低,专注自身功能逻辑;观察者被动接收更新,时间上解耦,实时接收目标者的更新状态
  • 缺点:观察者虽然实现了对象间依赖关系的低耦合,但却不能对事件进行细分管理,如筛选通知指定主题事件通知

发布订阅模式

观察者和目标要相互知道

发布者和订阅者不用相互知道,通过第三方实现调度,属于经过解耦合的观察者模式

    const PubSub = {
        message: {

        },
        // 发布
        publish(type, data) {
            if (!this.message[type]) return
            this.message[type].forEach(item => item(data));
        },
        // 订阅
        subscribe(type, cb) {
            if (!this.message[type]) {
                this.message[type] = [cb]
            } else {
                this.message[type].push(cb)
            }

        },
        unsubscribe(type, cb) {
            if (!this.message[type]) return
            if (!cb) {
                this.message[type] && (this.message[type].length = 0)
            } else {
                this.message[type] = this.message[type].filter(item => item !== cb)
            }
        }

    }
    function testA(params) {
        console.log('testA', params);
    }
    function testB(params) {
        console.log('testB', params);
    }
    function testC(params) {
        console.log('testC', params);
    }
    PubSub.subscribe('A', testA)
    PubSub.subscribe('A', testC)
    PubSub.subscribe('B', testB)
    PubSub.publish('A', '消息来喽')
    PubSub.unsubscribe('A', testC)
    PubSub.publish('A', '消息来喽')
    PubSub.unsubscribe('A')
    PubSub.publish('A', '消息来喽')

模块模式

模块化模式最初被定义在传统软件工程中为类提供私有和公共封装的一种方法

能够使一个单独的对象拥有公共/私有的方法和变量,从而屏蔽来自全局作用域的特殊部分,这可以减少我们的函数名与页面其他脚本区域内定义的函数名冲突的可能性

    let testModule = (function () {
        let count = 0
        return {
            incrment() {
                return ++count
            },
            decrment() {
                return --count
            }

        }
    })()
    console.log(testModule.incrment());
    console.log(testModule.incrment());

 es6模块化

 export default {
        name: 'moduleA',
        test() {
            return 'test'
        }
    }
<script type="module">
    import moduleA from './1.js'
    console.log(moduleA);
</script>

module模式使用了闭包封装“私有”状态和组织,它提供了一种包装混合公有/私有方法和变量的方式,防止起泄露至全局作用域,并与别的开发人员接口发生冲突,通过该模式。只需返回一个共有api,而其他一切都维持在私有闭包里

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在 Android 应用开发中,开发一款仿 OPPO 手机计算器的应用是极具实践价值的任务,它融合了 UI 设计、事件处理以及数学逻辑等多方面的技术要点。当前的“最新版仿 OPPO 手机计算器--android.rar”压缩包中,提供了该计算器应用的源代码,这为开发者深入学习 Android 编程提供了宝贵的资源。 UI 设计是构建此类计算器应用的基石。OPPO 手机的计算器界面以清晰的布局和良好的用户交互体验著称,其中包括数字键、运算符键以及用于显示结果的区域等关键元素。开发者需借助 Android Studio 中的 XML 布局文件来定义这些界面元素,可选用 LinearLayout、GridLayout 或 ConstraintLayout 等布局管理器,并搭配 Button 控件来实现各个按键功能。同时,还需考虑不同分辨率屏幕和设备尺寸的适配问题,这通常涉及 Density Independent Pixel(dp)单位的应用以及 Android 尺寸资源的合理配置。 事件处理构成了计算器的核心功能。开发者要在每个按钮的点击事件中编写相应的处理代码,通常通过实现 OnClickListener 接口来完成。例如,当用户点击数字键时,相应的值会被添加到显示区域;点击运算符键时,则会保存当前操作数并设定运算类型。而对于等号(=)按钮,需要执行计算操作,这往往需要借助栈数据结构来存储操作数和运算符,并运用算法解析表达式以完成计算。 数学逻辑的实现则是计算器功能的关键体现。在 Android 应用中,开发者可以利用 Java 内置的 Math 类,或者自行设计算法来完成计算任务。基本的加减乘除运算可通过简单的算术操作实现,而像求幂、开方等复杂运算则需调用 Math 类的相关方法。此外
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端 贾公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值