2020-3-18 前端达人
好,下面我将结合一些实例,说一下我对组合模式以及观察者模式的了解:
1、组合模式:
组合模式在对象间形成树形结构;
组合模式中基本对象和组合对象被一致对待;
无须关心对象有多少层, 调用时只需在根部进行调用;
将多个对象的功能,组装起来,实现批量执行;
想象我们现在手上有个万能遥控器, 当我们回家, 按一下开关, 下列事情将被执行:
到家了,开门
开电脑
开音乐
// 先准备一些需要批量执行的功能 class GoHome{ init(){ console.log("到家了,开门"); } } class OpenComputer{ init(){ console.log("开电脑"); } } class OpenMusic{ init(){ console.log("开音乐"); } } // 组合器,用来组合功能 class Comb{ constructor(){ // 准备容器,用来防止将来组合起来的功能 this.skills = []; } // 用来组合的功能,接收要组合的对象 add(task){ // 向容器中填入,将来准备批量使用的对象 this.skills.push(task); } // 用来批量执行的功能 action(){ // 拿到容器中所有的对象,才能批量执行 this.skills.forEach( val => { val.init(); } ); } } // 创建一个组合器 var c = new Comb(); // 提前将,将来要批量操作的对象,组合起来 c.add( new GoHome() ); c.add( new OpenComputer() ); c.add( new OpenMusic() ); // 等待何时的时机,执行组合器的启动功能 c.action(); // 在内部,会自动执行所有已经组合起来的对象的功能
由此,我们可以总结一下组合模式的特点
:
1.批量执行
2.启动一个方法,会遍历多个方法,同时执行,有点类似于递归的感觉
3.组合模式略微耗性能,但是执行方便
目前只是一个基础组合。
高级组合:
1.组合成树状结构,每个对象下,还会有自己的子对象
2.如果执行了父对象的某个方法,所有的子对象会跟随执行
3.组合模式一般建议使用在动态的html结构上,因为组合模式的结构和html的结构,出奇的一致
4.基本对象和组合对象被一致对待, 所以要保证基本对象(叶对象)和组合对象具有一致方法
2、观察者模式:
观察者模式也叫也叫Observer模式、订阅/发布模式,也是由GoF提出的23种软件设计模式的一种。
观察者模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态,或者说执行对应对象的方法(主题数据改变,通知其他相关个体,做出相应的数据更新)。
这种设计模式可以大大降低程序模块之间的耦合度,便于更加灵活的扩展和维护。
以观察的角度,发现对应的状况,处理问题。
观察者模式包含两种角色:
①观察者(订阅者):会随时更新自身的信息或状态(订阅者可以随时加入或离开);
②被观察者(发布者):接收到发布者发布的信息,从而做出对应的改变或执行。
很方便的实现简单的广播通信,实现一对多的对应关系。
核心思想:观察者只要订阅了被观察者的事件,那么当被观察者的状态改变时,被观察者会主动去通知观察者,而无需关心观察者得到事件后要去做什么,实际程序中可能是执行订阅者的回调函数。
Javascript中实现一个例子: