设计模式

  1. 接口:在js中没有定义接口的概念,需要通过模拟高级程序语言的方式来创建js中的接口
  1. 概念:提供一种以说明一个对象应该有哪些方法的手段
  2. 建立js接口的三种方式
  1. 注释描述接口:
<1>如果一个方法没有大括号{}就表示是一个没有被实现的方法
<2>优点:按照注释中定义的接口去实现方法,程序员有一个参考
<3>缺点:
  1. 接口明显就是假的,因为是一个注释的方式(还属于文档的范畴)
  2. 如果在实现方法的时候少了一个不会报错,太松散,没有办法检查接口的方法是否都被实现
  1. 属性检测接口(其实就是去判断接口到底存不存在。和第一种没有什么区别,不同的地方就是在于多了一个检测的功能而而已)
<1>特点:会在类的内部显式的把你要实现的接口都接收
<2>一般来说,项目经理会要求在类的内部定义一个变量(名字要固定),这个变量就去接收你所要实现的接口的名字
<3>要有一个专门的函数去检测当前对象是否已经实现了所有的接口
<4>虽然不再是一个简单的文档叙述,能检测接口,但是不能检测到接口里面的方法
  1. 鸭式辩型接口(最完美的实现js接口的方式:既保留了面向对象又是新了解耦):可以检测方法
<1>接口类:用于实例化接口的类,起名的时候一般都起Interface
①接口类需要两个参数
  • 参数1:接口的名字(实际上就是一个String类型的字符串)
  • 参数2:接收方法名称的数组methods(array数组,并且所有方法的名称都必须是String类型的才行)
②步骤
- 判断接口参数的个数:就是判断new的接口实例传递了几个参数
  1. 接口的利弊
  1. 弊:对于一些中小型程序来说,使用接口是不明智的,对项目来说接口的好处也不明显,只是徒增复杂度而已
  2. 利:促进代码的重用,对于开发来讲还可以告诉程序员哪些类使用了什么方法。如果你事先知道接口就减少了你在编码的时候对类与类之间冲突,实现解耦。对于测试和调试也会变得轻松。js属于弱类型语言,类型不匹配经常出现,使用接口的时候这一点就会变得容易一些
  1. 单体模式:这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的变量进行访问。通过确保单体对象只存在一份实例(只能实例化一份实例,创建不了多个对象),你就可以确信自己的所有代码使用的都是同样的全局资源
  1. 简单单体
  1. 只能创建一个对象,把所有的数据和方法都组织到一个地方里
  2. 一般是不能采用new关键字的
  3. 还可以划分命名空间
  4. 不能添加私有变量和方法
  1. 闭包单体(借用闭包创建单体,这样的话里面所有的属性和方法都变成私有化的了)
  1. 可以添加自己的不希望被外界访问的私有成员
  2. 不管是什么情况下只要是运行脚本,都没办法控制返回对象,都会返回整体单体对象
  1. 惰性单体(有些类似于闭包单体)
(1)和闭包单体的区别就在于惰性单体专门有一个私有变量控制返回的单体对象(需要就返回,不需要就不返回)
  1. 分支单体(主要就是判断程序的分支,就和switch语句差不多):一般用于浏览器的差异检测(也就是说它判断浏览器是火狐还是ie什么的)
  1. 函数的链式调用
  1. 简单链式调用:return this ;
  2. 模拟jquery底层链式调用
(1)在大型程序开发中一般使用下划线_作为私有的对象
  1. 常用设计模式
  1. 工厂模式:一个类/对象中旺旺会包含别的对象,就创建一个工厂来管理他们的实例过程,这样可以控制程序,使程序更加面向对象、多态化(其核心就是为了生产对象,实现解耦)
  1. 实现简单工厂
<1>一定要先写继承再去扩充子类特有的方法
<2>工厂模式的特点:把一个类的任务单独用细粒度表示去建立出来
  1. 细粒度:更精确的过滤
  2. 粗粒度:大体上的过滤
  1. js中实现抽象类的概念,实现复杂的动态工厂
  1. 桥接模式:既能把两个对象连接在一起,又能避免二者之间强耦合的方法。通过“桥”把彼此联系起来,同时又允许各自独立变化
  1. 主要作用表现为将抽象与其实现隔离开来,使它们可以独自实现
  2. 桥接实例
<1>事件监听回调机制
①什么是事件监听回调机制?打个比方:用户点击一个按钮,向服务器发送信息
<2>特权函数
<3>桥接组织多个单元
  1. 组合模式:是一种专门为创建Web上的动态用户界面而量身制定的模式。使用这种模式可以用一条命令在多个对象(这里的对象指的是不同的类)上激发复杂/递归的行为。这可以简化粘合性代码,使其更容易维护,而那些复杂行为则被委托给各个对象
  1. 优点
<1>可用同样的方法处理对象的集合与其中的特定子对象
<2>可以用来把一批子对象组织成树形结构,并且使整棵树都可以被遍历
  1. 组合模式应用的特点和必须要做的事情
<1>组合模式应用的场景
  1. 存在一批组织成某种层次体系(比如树状层次结构)的对象
  2. 希望这批对象/其中一部分对象实施一个操作
<2>组合模式的特点:
  1. 组合模式中只有两种类型对象:组合对象(叶子对象上面全部的对象)、叶子对象(最小的结点)
  2. 这两种类型都实现同一批接口
  3. 一般我们会在组合对象中调用其方法并隐式调用“下级对象”的方法(这里我们一般采用递归的形式去做),也就是说直接调用组合对象的方法,然后这个组合对象的方法会隐式的去调用它真正能实现具体操作的下级对象
  1. 门面模式
  1. 作用
<1>简化类的接口
<2>消除类与使用它的客户代码之间的耦合
(2)目的:为了让开发人员用更简单的方法调用一些相对复杂/组合的方法,主要就是简化开发的复杂性,提供一个相对容易的API去调用内部的方法供外界去使用,这样程序开发就会变得轻松一些,编写一次组合代码后可以反复的使用它,有助于节省时间和精力
5、适配器模式
(1)适配器模式可用来在现有的接口和不兼容的类之间进行适配,使用这种模式的对象又叫做包装器(wrapper),因为它们是在用一个新的接口包装另一个对象,借助适配器可以处理一些与API不匹配、不能一同使用的情况
(2)注意适配器的门面虽然比较类似,但是门面模式只是为了简化一个接口,它并不是提供额外的选择,适配器则要把一个接口转换为另一个接口,它并不会滤除某些能力,也不会简化接口
6、装饰者模式(decorator):是一种为对象添加新特性的技术,并不适用创建新子类的这种手段。装饰者模式可以用来透明的把原始对象包装在具有同样接口的另一个对象之中。这样就可以为对象添加一个方法/一些行为,然后将方法调用传递给原始对象
(1)优点:原始对象不用做任何的修改,子类对象就可以在原始对象的基础上增加新特性并且还影响了原始对象的方法(也就是说在原始对象的基础上扩展了新的方法,并且这些新的方法想去掉就去掉,想用就添加,和原始对象的方法不会耦合<其实就是在不改变原有对象的基础上去扩展一些想要的方法和需求>)
(2)装饰者模式不仅可以用在类上还可以用在函数上
<1>既不改变原始函数又不会影响以后的需求变化
7、享元模式:是一种优化模式,最适合解决因创建大量类对象而累及性能的问题(通过把大量独立对象转化为少量共享对象可降低运行Web应用程序所需要的资源数量)
(1)享元模式的基本优化
<1>内在数据(静态的,不能随意修改)
<2>外在数据(动态的,可以随意修改)
(2)享元模式就是把公共的静态的数据抽出来让它们只实例化一次,然后与外在数据进行结合
(3)一些公共的东西用静态工厂实例化出来并且只实例化出来一次,然后和动态的东西进行组合 
(4)Web日历的模拟,利用享元模式优化程序
8、代理模式:代理(proxy)是一个对象,它可以用来控制对一个对象的访问,与另外那个对象实现了同样的接口,并且会把任何方法调用传递到那个对象
(1)代理模式最基本的形式是对访问进行控制。代理对象和另一个对象(实体)实现的是同样的接口,实际上工作还是本体在做,它才是负责执行所分派的任务的那个对象/类,代理对象中所做的不外乎节制对本体的访问,它不会添加方法/修改方法(如装饰者),也不会简化接口(如门面元素)。它实行的接口与本体完全相同,所有对它进行的方法调用都会被传递给本体
(2)主要的目的是去延迟对本体对象的访问和加载(可能本体对象加载的时候需要的时间可能非常长,可能你要访问一个界面,一访问这个界面就需要加载这个本体对象,但是访问这个界面之后这个本体对象可能有一些内部的功能还不需要用到,那加载本体对象就没有什么意义。代理对象就是你什么时候去用本体对象某些具体的方法的时候就调用代理对象的方法,代理对象再传给本体对象,然后再去初始化本体对象)
(3)代理对象和本体对象应该实现共同的接口(也就是说要实现共同的方法)
(4)代理对象的方法其实就是一个空壳,会把自己虚拟的方法传递到本体对象中真实的方法,具体做事情的还是本体对象
(5)加载一个组件并没有任何用处的时候就可以用一个代理对象代替这个组件,然后先不实例化,具体什么时候去用这个组件的细节方法的时候再去实例化该组件
9、观察者模式:在事件驱动的环境中,比如浏览器这种继续寻求用户关注的环境中,观察者模式是一种管理人与任务之间的关系的工具,这种模式的实质就是你可以对程序中的某个对象的状态进行实时观察,并且当该对象状态发生改变时进行通知
(1)观察者模式中存在两种角色:观察者(发布者)、被观察者(订阅者)
10、命令模式
(1)命令模式是一种封装方法调用的方式。命令模式与普通的函数有所不同,它可以用来对方法调用进行参数化处理和传递,经这样处理过的方法调用可以在任何需要的时候执行
(2)命令模式可以消除调用操作的对象和实现操作的对象之间的耦合
(3)命令模式的结构:最简形式的命令对象是一个操作和用以调用这个操作的对象的结合体。所有的命令对象都有一个执行操作,其用途就是调用命令对象所绑定的操作,在大多数命令对象中,这个操作是ige名为execute/run的方法,使用同样接口的所有命令对象都可以被同等对待并且可以随意互换
(4)命令模式使用接口:目的是为了检测命令对象是否实现了相应的操作
(5)客户、调用者、接受者:客户创建命令(创建实例),调用者(当前命令的实例)调用这个执行命令,接受者在命令执行时进行相应的操作
(6)命令模式分类:简单命令模式、复杂命令模式、闭包命令模式(就是用闭包去封装命令模式:可以更加灵活的调用命令)
11、责任链模式
(1)可以用来消除请求的发送者和接收者之间的耦合。这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的。链中的每个对象可以处理请求,也可以将其传给下一个对象。js内部就是使用这个模式来处理时间捕获和冒泡的问题
(2)责任链模式中的角色:发出者、接收者
(3)责任链模式的流程
<1>发送者知道链中的第一个接收者,它向这个接收者发出请求
<2>每一个接收者都对请求进行分析,要么处理它,要么往下传递
<3>每一个接收者知道的其他对象只有一个,即它的下级对象
<4>如果没有任何接收者处理请求,那么请求将从链上离开,不同的实现对此有不同的反应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值