浅析Typescript设计模式

 服务三类     |      2019-02-10 10:09

  设计模式就是软件开发过程中形成的套路,就如同你在玩lol中的“正方形打野”,“四一分推”,又或者篮球运动中的“二夹一”,“高位单打”一样,属于经验的总结。

  由于设计模式和软件开发的语言,平台都没有关系,因此,前端工程师对设计模式也是有需求的。

  现在大家谈的前端工程化,如果脱离设计模式,只能算徒有其表,设计模式才是工程化的灵魂。当然,既然是经验和历史总结,有时候并不需要系统地进行学习,口口相传也是可以的,但是单独系统地讲解设计模式,就是要将“公共知识”转变为“共有知识”,戳破皇帝的新衣,让大家真正能言之有物,交流通畅。

  创建型模式主要解决对象创建什么,由谁创建,何时创建的3w问题,对类的实例化进行了抽象,分离概念和实现,使得系统更加符合单一职责原则。

  结构型模式描述如何将类或者对象组合在一起,形成更大的数据•□▼◁▼结构,因此也可以分为类结构型和对象结构型。

  行为型模型对不同的对象划分责任和算法的抽象,关注类和对象之间的相互作用,同样也分为类和对象。

  可以看到三种类型的模式正好解决了编程中的数据结构从哪里来?如何组合?如何交流?的问题。

  创建型模式一共有4个,分别为工厂(工厂,工厂方★△◁◁▽▼法,抽象工厂合并),建造者,原型,单例。

  因为有时候创建实例时需要大量的•●准备工作,而将这些准备工作全部放在构造函数中是非常危险的行为,有必要将创建实例的逻辑和使用实例的逻辑分开,方便以后扩展。

  这样的封装,能清楚地分离对象的创建和使用。同时,如果之后的类的定义发生了改变,可以直接修改Peop▪▲□◁le,创建类的准备数据发生了改变,则修改工厂函数。

  但是,选择工厂模式的原因是因为构造函数足够复杂或者对象的创建面临巨大的不确定性,只需要传入变量即△▪▲□△可构造的情况下,用工厂函数实际上是得不偿失的。

  几乎所有的设计模式都会带来代码可读性下降的风险,因此需要找到代码可读性降低和可维护性,稳定性之间的平衡!

  你也可以用函数根据参数返回相应的工厂函数,又或者用一个类集中管理工厂函数来处理复杂度。

  建造者模式用于直接构建复杂对象,比如上例中的构造函数参数,如果采用一个结构表●示:

  当然,仅仅三个属性的对象,远远没有达到复杂对象的程度,因此,只有在对象十分复杂的时候,才需要应用到建造者模式。

  这样每次返回的都是新的对象,也可以相当于是对象的拷贝,但是如▲●…△果直接拷贝对象,应该怎么写呢?

  单例模式的目的是限制一个类只能被实例化一次,防止多次实例化。其中,根据类被实例化的时间,又被分为懒汉单例和饿汉单例。懒汉单例是指在第一次调用实例的时候实例化,饿汉单例是指在类加载的时候就实例化。

  四种创建模式都有其使用场景,需要针对使用场景进行组合,才能写出高质量的代码。

  想想你的转接头,实际上就是被适配对象(adaptee)上套上一层封装,将其接口与目标对象(target)相匹配,所以适配器又叫wraper(包皮)。

  适配器模式对多个不同接口的匹配非常有效,实际情况中没有必要完全使用类来封装,一个函数也可以搞定。

  桥接模式的主要目的,是将抽▽•●◆象与实现解耦,使得二者可以独立地进行变化,以应对不断•☆■▲更细的需求。

  其实通俗地来说,就是将所有概念想象成“灵魂——肉体”,凡是能用这个概念代入的,都可以用桥接模式重构。

  比如汽车这个概念和颜色这个概念,可以将颜色作为汽车的成员变量,但是当颜色变得更加复杂时,比如渐变,模糊,图案等属性加入,不得不将其解耦,桥接模式就很重要了。

  我们先定义抽象类Car和Color(Ts的抽象类功能对于实现之一模式非常重要):

  桥接模式会增加大量代码,所以一定要在使用之前对功能模块有一个恰当的评估!

  装饰模式是在现有类或对象的基础上,添加一些功能,使得类和对象具有新的表现。

  还是之前的Car和Color的问题,可以直接继承◆■Car,添加颜★◇▽▼•色,这是一个装饰模式:

  但是采用继承的方式是静态的,而且会导致在继承复用的过程中耦合,比如Car2继承Car,在创建新的子类时错把Car2作为父类,结果就很容易出错◆◁•了。

  装饰器会拦截Car的构造函数,生成一个继承自Car的新的▪…□▷▷•类,这样更加灵活(但是注意这个过程只发生在构造函数阶段)。

  简单一句话总结:“封装复杂,接口简单”,为所有的子系统提供一致的接口,比如轮胎,方向盘和○▲-•■□车。

  享元模式避免重新创建对象,其实只要有缓存对象的意思,并且共用一个对象实例,就是享元模式。

  全权负责两个模块之间的通讯,比如MVC,MVVM就是非常典型的中介模式。

  观▪•★察者模式的目的是为了“检测变更”,既然要检测变更,自然需要记录之前的信息:

  可以把观察者模式看成是“记录事件”,这对于理解观察者模式和状态模式区别很有帮助。

  实际上前端很多事件处理,就是基于观察者模式的,在上例中的update中的state,就是事件名称,js的事件循环会轮流处理states的状态变化。

  与观察者模式相对,表示的是“记录状态”,只要状态变更,表现即不同,这是设计数据驱动的基础。

  策略模式表示动态地修改行为,而行为有时候是一系列方法和对象的组合,与命令模式的区别也在这里。

  设计模式根植于面向对象思想,也就是任何实★-●=•▽现都要区分概念(类)和实例(对象),也就▼▲是要分清楚白马和马,这样才能竟可能减轻扩展和团队协作的负担。

  但是任何东西有利就有弊,扬长避短才是我们应该在意的方向。返回搜狐,查看更多

乐彩论坛17500