设计模式是什么?有哪些?

【问】设计模式是什么?有哪些?

【答】设计模式是针对特定问题摸索出的最佳实践经验总结,通过抽象化的手段形成通用模型,其目的是为了软件的可复用性、可扩展、易于理解等。前端开发常用的设计模式有:

  1. 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点
  2. 观察者模式(同发布订阅者模式,不同的实现):被观察者状态变化后通知观察者
  3. 工厂模式:批量创建对象

【实现1:单例模式】

function Person(){
    this.name = "zhangsan"
}

const singleIns = (function() {
    let instance = null;
    return function (){
        if(!instance){
            instance = new Person();
        }
        return instance;
    }
})()

const p1 = singleIns();
const p2 = singleIns();

在这里插入图片描述
【实现2-1:观察者模式】

// 观察者构造函数 ==============================
class Observer {
    constructor(name, fn = () => {}) {
        this.name = name;
        this.fn = fn;
    }
}
const observer1 = new Observer('观察者1', (state) => {console.log('我观察者1收到了', state)}); // 观察者1
const observer2 = new Observer('观察者2', (state) => {console.log('我观察者2收到了', state)}); // 观察者2
// 被观察者构造函数 =============================
class Subscribe {
    constructor(state) {
        this.state = state;
        this.observers = [];
    }
    setState(val) {
        this.state = val;
        this.observers.forEach((item) => {
            item.fn(this.state);
        })
    }
    addObserver(obs) {
        this.observers = this.observers.filter(item => item !== obs)
        this.observers.push(obs);
    }
    delObserver(obs) {
        this.observers = this.observers.filter(item => item !== obs)
    }
}
const Subscribe1 = new Subscribe(); // 被观察者1

//测试=========================================
Subscribe1.addObserver(observer1);
Subscribe1.addObserver(observer2);
// Subscribe1.setState('值修改为1')

在这里插入图片描述
【实现2-2:发布订阅者模式】

// 订阅发布者模式构造函数======================================
class Observer {
    constructor() {
        this.message = {};
    }
    on(type, fn) {
        if(!this.message[type]){
            this.message[type] = [];
        }
        this.message[type].push(fn);
    }
    off(type, fn) {
        if(!fn) {
            delete this.message[type];
            return;
        }
        if(!this.message[type]){
            return;
        }
        this.message[type] = this.message[type].filter(item => item !== fn);
    }
    trigger(type) {
        if(!this.message[type]) {
            return;
        }
        this.message[type].forEach(item => item());
    }
}
//测试=========================================
const observer1 = new Observer();
observer1.on('type1', handler1);
observer1.on('type1', handler1);
observer1.on('type2', handler2);
function handler1() {console.log("handler1触发")}
function handler2() {console.log("handler2触发")}
// observer1.off('type1', handler1);
// observer1.trigger('type2');

订阅:
在这里插入图片描述
取消订阅:
在这里插入图片描述
发布通知订阅:
在这里插入图片描述
【实现3:工厂模式】

// 工厂模式构造函数======================================
function CarFactory(brand, price) {
    var car = {};
    car.brand = brand;
    car.price = price;
    car.getPrice = function() {
        return this.price;
    }
    return car;
}

var car1 = CarFactory('品牌A', 1);
var car2 = CarFactory('品牌B', 2);

在这里插入图片描述

参考1:JS-设计模式 bilibili
参考2:JS设计模式一:工厂模式 掘金

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值