JS设计模式开篇
前言
作为小小程序员一枚,除了敲个hello,world以后啥都不会了,最近发现设计模式这个东西挺好,想搞一下,声明,本屌不是一个看见什么好,什么新潮就追什么的人,本屌还是一个比较实际的人,一般不会说什么好要什么,学设计模式完全是个人的爱好,看一看做是无聊打发时间的消遣吧.
什么是设计模式呢?既然是个模式,就说明可以套用这个模式,套用你知道是什么意思吧?一本万利明白吧?差不多就是这个意思,等你熟练掌握了所有的设计模式之后,你就可上九天揽月,可下五洋捉鳖.手握日月摘星辰,世间无我这般人!
各个代码的设计模式集合每个人都知晓,就算不会那也一定在某些大牛口中听过.但是很少有人知道设计模式的由来:
设计模式的术语源于Erich Gamma等人在上世纪90年代从建筑设计领域引入到计算机科学的.它是对软件设计中一些反复出现,普遍存在的问题所提出的解决方案.所以说设计模式并不是某种语言的某块代码,设计模式是一种思想,提供给在编码的时候遇到的各种问题是可以采取解决方案的,更倾向于一种逻辑思维,而不是万能的代码.
设计模式使人可以更加简单方便的复用一些较为成功的设计和体系结构,使用设计模式来使人理解整个系统的卡法思路.
设计模式的四要素:
模式名称:每个模式都有一个名字,往往这个名字能表达这种设计模式的作用
问题:那种情况下使用该设计模式,或者说该设计模式对应着那种具体的情况
解决方案:该设计模式能解决的问题
效果:使用了该设计模式的好处
设计模式一共有23种
创建型模式:单例模式,抽象工厂模式,建造者模式,工厂模式与原型模式
结构型模式:适配器模式,桥接模式,装饰者模式,组合模式,外观模式,享元模式以及代理模式
行为型模式:模版方式模式,命令模式,迭代器模式,观察者模式,中介者模式.备忘录模式,解释器模式,状态模式,策略模式,职责链模式和访问者模式.
这些都不是我自己造的啊,都是明明白白写的,专家们定义好的,不管是JAVA设计模式,还是C#设计模式,还是JS设计模式都是这23种设计模式,而且名字也是一模一样!
下面对每种设计模式进行一下必要的描述
抽象工厂模式
客户类与工厂类分开,当客户需要某种产品时向对应工厂发出请求.缺点是当产品需要修改时,工厂类也需要做相应的修改.
意图:
提供一个创建一系列相关或者相互依赖的对象接口,无需指定它们具体的类.
适用性:
一个系统要独立与它的产品创建,组合的时候.
一个系统要由多个产品系列中的一个来配置的时候.
强调一系列相关产品对象设计以便进行联合使用时.
对于一个产品库,只想显示接口而不是具体的实现的时候.
工厂方法模式
某核心工厂类不再负责所有的产品创建,而是将具体工作委托给了子类,自身称为一个抽象的工厂角色,仅负责给出工厂来必须实现的接口,而不需要关系具体哪种产品被实例化的细节.
意图:定义一个用于创建对象接口,让子类来决定实例化那一个雷,将类的实例化延迟到其子类.
适用性:
当一个类不知道他所必须创建的对象的类的时候.
当一个类希望由其子类来创建对象的时候.
建造者模式
将对子昂的内部表象和对象的生产过程分割开来,从而使得一个建造过程具有不同内部表象的 产品对象,.建造者模式使得产品内部表象可以独立出来变化,客户不需要知道内部细节,可以强制实行一种分步建造过程.
意图:将一个复杂的对象的构建与它的表现分离,是童颜的构建形式可以得到不同的表示.
适用性:
当复杂对象的算法需要独立于对象的组成部分以及装配方式的时候.
构造过程允许构造不同的对象表示.
适配器模式
将一个类的接口变为客户端所希望的接口类型,从而使原先因接口不匹配而无法工作的两个类可以一起工作.
意图:
将某个接口改装变为所需要类型的接口,也可以是原本不兼容的接口适配成兼容.
适用性:
希望使用一个已经存在的类,但是与你所需要的接口有些不吻合时.
希望创建一个可以复用的类,可以与其他已存在或者未存在的类进行协同工作.
桥接模式
将抽象化和实例化解耦,使得两者可以独立变化.即降低耦合度.也就是说将抽象化和实例化之间的关系使用组合/聚合的关系而非继承关系,,两者可以独立的变化.
意图:
将抽象部分与它的实现部分分离,使他们可以单独的变化.
适用性:
在对于抽象部分和实现部分不希望使用固定的关系.
类的抽象和类的实现都应该可以通过生成子类的方式来加以扩充.
对一个抽象的实现部分的修改应对客户不产生影响.
希望在多个对象之间共享(比如说使用引用计数),但是客户不知道这一点.
职责链模式
在职责链模式中,很多对象由每一个对象对其下家的引用而连接起来的一条链.请求在这个脸上进行传递直到链上的某一个对象决定处理该请求.对于链上的每一个对象成为处理者,处理者有两个选择:承担处理责任或者将请求传递给下家,请求可以不被任何对象处理.
意图:
十多个对象都有机会处理请求,从而避免请求发送者和接受者之间的耦合关系.将这些对象连成一条链,并且沿着该链传输,知道有对象对它进行处理.
适用性:
又多个对象可以处理一个请求,具体是哪个对象处理会在运行时自动确定.
在不明确接受者情况下,向多个对象提交一个请求.
可以动态的指定那个对象集.
命令模式
命令模式将一个请求或者操作封装到一个对象中.命令模式将发出命令和执行命令的责任分开,委派给不同的对象.命令模式也允许也允许请求方盒接收方相互独立,使得请求方不需要知道接收方的接口等.
意图:
将一个请求风转为一个对象,从而可以使你因不同的请求对客户进行参数化.对于一些排队的请求可以进行取消操作.
适用性:
抽象出待执行的动作一参数化某对象可以使用回调表达这种参数化机制.
在不同的时刻制定,排列和执行请求.一个command对象可以有一个与初始请求无关的生存期.
支持对于取消,修改操作.
用构建在原语上的高层构造一个系统,一个事物疯转了对数据的一组改动,command模式提供了对实物进行建模的方法,有一个公共的接口,使得可以使用一种方式来调用所有的事务.也易于添加新事务以扩展系统.
组合模式
组合模式间对象组织到树结构中,可以用来描述整体和部分的关系.组合模式就是一个处理对象的树结构的模式.
意图:
将对象组合成树形结构以表示”部分-整体”的层次关系,使用户对于单个对象和组合对象使用具有一致性.
适用性:
对于对象希望表现出部分-整体的层次结构
希望统一使用结构中的所有对象.
装饰者模式
装饰者模式以对客户端透明的凡是来扩展对象功能,世纪城关系的一个替代方案,提供了比继承更多的灵活性.动态给对象添加功能,这些功能也能动态撤销.常用于对增加一些基本功能的排列组合而产生的非常大量的功能.
意图:
动态的给一个对象添加一些额外的职责.就增加功能来说,装饰者模式比生成子类更为灵活.
适用性:
在不影响其他的对象情况下,以动态的,透明的方式给单个对象添加职责.
当无法使用类似生成子类的方法进行类的扩展的时候.涂有大量的独立应用,为支持各种组合那么僵出现数量级爆炸的情况,或者类定义被隐藏等不能用于生成子类.
外观模式(门面模式)
外部有一个子系统的通信必须通过一个统一的门面对象进行.门面模式提供一个更高级的接口使得子系统更容易使用.每一个子系统只有一个门面模式,次门面模式只有一个实例,即单例模式.整个系统中可以有多种门面类.
意图:为子类系统中的一组接口提供一致的界面,外观模式定义了一个高级接口以便子类更容易的调用.
适用性:
当需要为一个非常复杂的子类系统提供一个简单的接口的时候.
外观模式提供一个简单的缺省视图,这一视图对大多数用户来说已经OK,而对高级用户可以绕过外观层进行所需要的处理.
享元模式
享元模式以共享的方式高效的支持大量细粒度对象.共享的关键是区分内蕴状态和外蕴状态.内蕴状态存储在享元内部不会随环境的改变而有所不同.外蕴状态就是随环境的改变而变化的.两者相互独立互不影响.将可以共享的状态和非共享的状态从常规类里面区分出来.客户不可以直接创建共享对象,应当使用一个工厂对象负责创建共享的对象.享元模式可以大幅度的减低内存中对象的数量.
意图:
运用共享技术有效的支持大量细粒度的对象
适用性:
一个程序中使用了大量的对象.
由于对象数量造成了大量的存储开销.
大多数对象的状态可以变为外部状态.
可以使用较少的共享对象来进行处理.
解释器模式
给定一个语言后,解释器模式可以定义出其文法的表示,并提供一个解释器.客户端可以使用这个解释器来解释该语言中的语句.解释器模式将描述怎样再有了一个简单的文法后使用模式设计解析这些语句.该语言是指任何解析器对象能够解释的任何组合.再解释器模式中需要定义一个代表文法的命令类的等级结构,每一个命令都有一个对应的解释.
意图:
给定一种语言,,定义文法表示,并且再定义一个解释器来转化该语言.
适用性:
简化文法所需要的逻辑处理,文法简单.
迭代器模式
迭代器模式可以顺序访问一个聚集中的元素而不必暴露内部表象.多个对象聚集在一起形成的整体称之为聚集,聚集对象则是包含一组对象的容器.迭代器模式将迭代逻辑封装到一个独立的对象中,与本身的聚集对象分离开来.迭代器模式简化了聚集的逻辑思想,将行为独立分割开来方便调试修改替换.所谓迭代算法可以独立与聚集对象进行变化.
意图:
提供一个方法顺讯访问一个聚集对象中的各个元素而又不暴露该对象的内部表示.
适用性:
访问聚合对象,而不希望内部暴露.
支持对于聚合对象的多种遍历.
为遍历各种对象提供统一的接口.
中介者模式
中介者模式包含了一系列对象相互作用的方式,使得这些对象不洗相互有明显的练习.使耦合变得松散.当某些对象发生改变的时候也不会影响其他的对象之间的作用,保证了各个对象之间的作用相互独立,这并不是对象与对象之间,而是作用与作用之间的练习变得独立开.中介者模式将多对多的相互作用转换为一对多的相互作用,将对象的行为和协作抽象化,把对象的一些小行为与其他对象的仙湖作用分开处理.
意图:
使用中介者来封装一系列的对象之间的交互,不显示的表示各个对象的相互引用关系,降低对象之间的耦合度.
适用性:
定义良好的一组对象需要很复杂的通信方式.从而缠身的相互依赖关系难以理解.
一个对象直接对其他很多对象进行通信导致了难以复用该对象.
需要定制一个分布在各个类中的行为又不行生成太多子类.
备忘录模式
别网路对象是以用来存储另一个对象内部状态的快找对象,意在在不破坏对象封装的前提下将一个对象的状态捕捉到,存储在外部以便可以随时观察记录,以便将来可以还原到某一状态.
意图:
在不破坏封装性的前提下捕获一个对象的内部状态并将该状态保存在对象之外来标记.
适用性:
需要注意必须对象的某一时刻状态并且不对对象造成封装性的破坏,不制造多余的暴露接口.
观察者模式
观察者模式定义了一种一对多的主功能太,让多个观察者同时监听某一对象.这个对象主题发生变化的时候会告诉所有的观察者对象,使它们自动更新自己.
意图:
定义对象的一种一对多的依赖关系,当一个对象发生改变的时候,所有依赖该对象的其他对象都将得到通知,并且被自动更新.
适用性:
当抽象模型具有两个方面,其中一个方面依赖于另一个方面,将这两者分开封装在独立的对象中使他们可以独立改变以及复用.
当一个对象在改变的时候需要同时改变其他对象,并且这个对相机和有可能会改变.并且不能界定这些对象来增加耦合度.
原型模式
通过给出一个原型对象来指明所要创建的对象类型,复用这个原型对象来创建出更多的同类型对象.原型模式允许动态的增加或者减少产品类,可以不需要任何的等级结构,原型模式适用于任何结构.
意图:
用原型实例来指定对象创建的种类,并且通过拷贝这些原型来创建新的对象.
适用性:
需要实例化的类在运行时候指定.
代理模式
地阿里模式给某一对象提供一个代理对象,并由代理对象控制队形源对象的引用.在某些情况下客户不想或者不能直接饮用一个对象,代理对象在客户和目标对象中起到中介的作用,代理模式可以仅仅只有一个被代理的接口,这时候代理对象不能创建被代理的对象,被代理的对象必须由系统的其他角色代为创建和传入.
意图:
为其他对象提供一种代理来控制对于某个特定对象的访问或者处理.
适用性:在需要使用比较复杂的对象指针的时候,使用简单指针代替.
单例模式
单例模式确保一个类只有一个实例,而且自行的实例化并且向整个系统提供该实例的接口.单例模式只有在真正需要单例的时候使用.
结构:
保证一个类只有一个实例,并且提供一个访问它的全局访问点.
实用性:
当类只能有一个实例的时候,客户端通过规范的额访问点来进行访问.
状态模式
状态模式允许一个对象在其内部改变的的时候改变行为.使得看上去可改变了类是一样的.状态模式将所研究的对象的行为包装在不同的对象里,每一个状态都属于一个抽象状态类的一个子类.状态模式需要对每一个系统可能取得的状态创建一个状态类的子类.当系统的状态发生变化的时候,系统便改变所选的子类.
意图:
允许一个对象在其内部状态改变的时候改变行为.
适用性:
一个对象的行为取决于他的状态,并且必须在运行时候根据状态来改变行为.
策略模式
策略模式针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得他们可以相互替换.策略模式使得算法可以在不影响客户端的情况下发生变化.将行为和环境分开,.环境类负责维持和查询行为类,各个算法在具体的粗略类中提供.所以算法的增减不会影响环境和客户端.
意图:
定义一系列算法进行单独封装,并且使他们可以相互替换,是算法独立于客户端变化而变化.
适用性:
许多相关的类,仅仅是行为上有所差别,策略模式可以实现在多个行为中选取一个来配置一个类.
模版方法模式
模版方法模式准备一个抽象类,将部分逻辑以及具体方法以构造子类的方法实现,然后声明一些抽象方法来使子类实现剩余的逻辑.不同的子类可以以不同的方式来实现这些抽象方法,从而实现对剩余逻辑的实现.先定制一个顶级的逻辑框架,然后将逻辑的细节留给具体的子类去实现.
意图:
定义一个算法骨架,将一些步骤延迟到子类中,使子类可以不改变一个算法结构却可以重新定义算法的步骤.
适用性:
一次性实现算法的不变部分,将可变部分留在子类中实现.
一个类定义多种行为,并且这些行为在这个类中的操作是以多个条件语句的形式出现.
访问者模式
访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦操作需要做修改,接受这个操作的数据结构可以保持不变.适用于数据结构相对未定的系统,将数据结构和作用于结构上的操作解耦可使得操作相对自由.访问者模式使得增加新的操作变得更加容易.访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个环节节点中.当使用访问者模式的时候要将尽量多的对象浏览逻辑放在访问者类中,而不是子类中.
意图:
表示一个作用于某个对象结构中的各元素的操作,使你可以在不改变各个元素的类的情况下定义作用于这些元素的新的操作.
适用性:
一个对象结构中包含多个类对象,具有不同的接口,而你希望对这些对象实施一些依赖于具体某个类的操作.
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,这些操作需要避免污染对象.访问者模式可以将相关的操作集中放入一个类中,被对象结构所共享,从而对象结构中的每个子对象都可以被共享到.
23种设计模式至此已学习完毕,是不会有点快?说的是不是有点少?是滴..有点少,在以后一个月的时间,咱们就一起来学学这些设计模式,我写的这些东西都是纯手打的,没有任何东西是复制粘贴的,你在学习的时候,希望也不要怕麻烦,多写,多练,多敲.
这几天去学车了,本来我还是个挺白的小生,结果成了小黑人了,唉,不过有一点好处啊,教练都说我太奢侈了,全天就我自己练,教练就只教我这么一个学员.这样挺好啊,学一天,跟上别人学好几天的时间了,happy