什么是观察者模式?

  • Post author:
  • Post category:其他




一、观察者模式

  1. 概念和场景

    观察者模式又叫发布者订阅者模式,它定义了一对多的关系,让多个观察者对象同时监听某一个主体对象,这个主体对象发生变化时就会通知所有的观察者对象,使得他们能够自己更新自己

    如:你订阅游戏主播,当主播开播的时候他就会给你推送开播消息;

    使用观察者模式的好处:

    1.1支持简单的广播通信,自动通知所有已订阅的对象。

    1.2页面载入后目标元素容易和观察者者存在一种动态关联,增加了灵活性。

    1.3目标对象与观察者之间的抽象耦合关系能够单独扩展及运用。



2、观察者模式代码:

 window.onload = function(){
let obs = new Observer();
// 1、订阅第一个文本框的内容
obs.addSubscribe(function(what){
    $("#sqrNum").value = what*what;
})
obs.addSubscribe(function(what){
    $("#cubeNum").value = what*what*what;
})
obs.addSubscribe(function(what){
    $("#fourNum").value = what*what*what*what;
})

// 2、发布(当第一个文本框的内容发生变化时,进行发布)
$("#num").oninput = function(){
    obs.publish(this.value);
}

}

class Observer{


constructor(){


this.arr = [];//保存所有的订阅者

}

// 添加订阅者
addSubscribe(callback){
    this.arr.push(callback);
}

// 删除订阅者
removeSubscribe(callback){        
    let index = this.arr.indexOf(callback);
    this.arr.splice(index,1);
}

// 发布
publish(what){
    // ES5新增的数组的方法
    for(let i=0;i<this.arr.length;i++){
        this.arr[i](what)
    }
}

}



二、设计模式的解释(借鉴)

​ 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码

设计经验的总结

。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

其实就是前人总结的,针对特定类型问题的类设计方案(代码的结构)


​ 总体来说设计模式分为三大类:

1、创建型模式:共五种:

工厂方法模式

、抽象工厂模式、

单例模式

、建造者模式、原型模式。

2、结构型模式:共七种:

适配器模式

、装饰器模式、

代理模式

、外观模式、桥接模式、

组合模式

、享元模式。

3、行为型模式:共十一种:策略模式、模板方法模式、

观察者模式

、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

​ 设计模式遵循的原则:

开闭原则(Open Close Principle)


​ 开闭原则就是说

对扩展开放,对修改关闭

。在程序需要进行扩展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。



三、单例模式



1、场景:



某个类只允许创建一个实例

,这就是单例模式。优点如下:

​ 1)、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销

​ 2)、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

​ 3)、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如:中国国家主席只有一个,飞机大战的地图对象只有一个),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。



四、工厂模式



1、场景

​ 工厂模式,就是用工厂的思路,创建对象。工厂是造产品的。现在用工厂来造对象。即一个工厂可以制造很多种类型的对象,这些对象一般具有共同的父类,即相似的类。

以下几种情景下工厂模式特别有用:

  • ​ 对象的构建十分复杂
  • ​ 需要依赖具体环境创建不同实例
  • ​ 处理大量具有相同属性的小对象



2、代码

需要:使用工厂模式创建html标签。

使用json对象的方式:



五、代理模式



1、概念和应用场景

​ 代理模式的定义是把对一个对象的访问, 交给另一个代理对象来操作。

​ 如:

​ 一般人需要打官司,需要找代理律师(术业有专攻);

​ 你需要打扫房子,可以找保洁公司(术业有专攻);

​ 我们在租房子的时候去找中介(因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做)

应用场景:

如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:

1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。

2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

使用代理模式,可以将功能划分的更加清晰,有助于后期维护!

代码展示:



版权声明:本文为qq_58982380原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。