设计模式(简单理解)

 

说在前头。本文通过对js设计模式的学习,总结出一些基本看一遍就能明白的设计模式,不管前端还是后端的设计模式基本上都是这个原理,只是实现方法不一样罢了。还有一些目前没来得及总结,后面再补充。

如果想看具体实现,请自行百度,本文只有What,没有How。

单例模式:仅有一个实例,调用时若无实例则创建实例,若有实例则重复利用

策略模式:将一个个方法通过一个公共方法组合起来,同时可以对这个组合里的方法进行增加和修改,使用时来调用公共方法,由公共方法来调用某个具体方法。

代理模式:代理模式就是在访问真正方法之前,先访问代理方法,由代理方法进行一波操作验证,再决定要不要访问真正方法。

                代理模式主要有三种:保护代理、虚拟代理、缓存代理

                保护代理:在访问真正的方法之前,先访问代理方法,通过代理方法对这个访问进行判断,决定是否能访问真正方法。

                虚拟代理:在访问真正的方法之前,可以加入一些额外的逻辑操作,例如函数节流可以放在这里。

                缓存代理:在访问真正的方法之前,尤其是对于一些开销大的运算,先判断代理是否有缓存,有的话直接返回,没有再访问真正方法,并缓存到代理方法中。

迭代器模式:按照顺序,从对象中依次取出数据。

                通过调用一个方法就能顺序访问一个对象中的各个元素,并不用暴露对象的内部表示,也并不关心迭代器内部实现,其实也就是在for循环外套了一层函数,一般使用较多的场景是遍历对象,例如数组的map和forEach方法已经内置了迭代器。

发布-订阅模式(观察者模式):官方概念:定义了对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知

               举个现实世界的例子,给多个训练有素的小狗狗起名字(这是订阅),喊谁的名字谁就过来吃饭(这是发布)。

                如果小狗狗名字都一样,这时候如果喊这个名字,所有小狗狗就都会来吃饭;如果改为让这个名字的小狗狗都坐下,所有小狗狗就都会坐下。

命令模式:官方概念:通过命令使得请求发送者和请求接收者能够消除彼此之间的耦合关系。

                在看完一些文档之后,我所理解到的是当执行某个操作时,调用一个命令方法,这个命令方法来调用具体的执行方法,来解决问题。

                看到这里一直有点蒙,消除耦合我理解,不在同一个方法里不就行了,把操作写到具体执行的方法里,需要时直接调用具体的执行方法就行了嘛,搞不懂为什么还要多加一层。

                冷静之后,明白了一丢丢,好像写到一个方法里和调用一个方法来执行,在程序执行上,并没有什么区别,还是耦合的。

                然后自己想了一个例子,总算搞懂了。看一下下面这个例子。


                普通写法:我在楼下喊:AAA吃饭了,AAA听到了并说OK,过了两天我不喜欢和AAA吃饭了,我想喊BBB吃饭,我得重新喊,BBB吃饭了,像我这种懒人,不想一直换名字喊,怎么办。

                命令模式:首先我买个机器人,设置一下喊AAA吃饭,然后我输入命令:干饭!机器人就帮我通知AAA去吃饭了;

                                过来两天不喜欢和AAA吃饭了,设置一下喊BBB吃饭,我还输入命令:干饭 !机器人就帮我通知BBB去吃饭了。


                我只需要说干饭就行了,并不需要说和谁一起;机器人只需要接到命令的时候,喊某某某吃饭就行了,并不需要知道谁让它喊的。这才叫解耦!

组合模式:由两部分组成,组合对象和叶对象,并且具有相同的数据结构,调用组合对象的方法时会递归调用叶对象的方法来处理。

模板方法模式:有两部分组成,一部分是抽象父类,一部分是具体实现的子类,抽象父类定义一些方法,并固定好方法的执行顺序,再将这些方法暴露出去,可以由子类来重写。由于父类已经固定好执行顺序,所以所有的子类执行方法顺序还是一致的。

享元模式:与单例模式相似,是一种性能优化的模式,是用来减少共享对象的数量,如果存在多个相似的对象,可以将公共部分剥离开来,生成内部状态多次复用;其余部分在外部维护。

                享元模式与单例模式区别:

                级别不同:单例模式是类级别,享元模式是对象级别。
                对象个数:单例模式严格控制只能有一个示例对象,享元模式可以再次创建,也可以取缓存对象。

                共同点就是都节约内存资源,节省对象创建时间。

责任链模式:有点像中间件的感觉,可以避免多重if分支语句。将多个处理方法串起来,当前方法处理不了就调用下一个方法,直到有方法处理为止,跟命令模式目的相似,也是为了避免发送者和接受者之间的耦合。

中介者模式:增加一个中介者对象,来将多个有关联的对象联系起来,当一个对象有变化时,只需要通知中介者就行,中介者会依次通知与之有关联的对象。减少修改某个对象就得在多个对象内部修改的情况。

装饰者模式:顾名思义,就是在对象上添加一些装饰,在不改变对象本身功能的基础上,增加额外的行为方法。

状态模式:将事物的每种状态都封装成单独的类,在处理的时候调用这个状态类,这个状态类来负责自身的行为。允许一个对象在其内部改变它的行为。

                举个简单的例子:开灯,起床;关灯,睡觉。

                一般情况我们分用分支语句来处理,若开灯的时候起床,若关灯的时候就睡觉。

                但是在状态模式中,将开灯和关灯封装成两个类,开灯类自身的行为就是起床,关灯类自身的行为就是睡觉,这时候我们只需要调用开灯和关灯负责的行为,就能得到起床还是睡觉。

                在复杂的场景中,调用方法,触发某个行为,输出这个行为的表现,这时候可以改变该行为,则再次调用的时候就会触发改变之后行为的表现,以此类推。

适配器模式:通过一个方法,对不兼容的部分进行适配。

                例如投屏的时候如果需要vga接口,有vga接口的电脑能正常投屏,但是没有vga接口的电脑则不能,这时候就需要提供转接头来适配。

外观模式:为子系统提供一个统一的入口,我们日常开发中最常用的应该就是这个了。

                比如我们的工具类,对一系列方法,提供一个统一的入口,根据这个入口调用某个具体工具方法。

 

有理解不对的地方,还望指正。

 

想看js设计模式具体实现的可以看一下下面链接。同时也是本文的参考链接:

https://www.cnblogs.com/imwtr/p/9451129.html

http://www.isjs.cn/?p=947

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值