博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js设计模式(3)---状态模式、责任链、装饰者
阅读量:4075 次
发布时间:2019-05-25

本文共 2876 字,大约阅读时间需要 9 分钟。

一、装饰者

装饰者模式 : 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。

1、下面演示仿java版本的装饰者模式。

var Plane = function () { };Plane.prototype.fire = function () {  console.log('发射普通子弹');}var MissileDecorator = function (plane) {  this.plane = plane;}MissileDecorator.prototype.fire = function () {  this.plane.fire();  console.log('发射导弹');}var AtomDecorator = function (plane) {  this.plane = plane;}AtomDecorator.prototype.fire = function () {  this.plane.fire();  console.log('发射原子弹');}var plane = new Plane();plane = new MissileDecorator(plane);plane = new AtomDecorator(plane);plane.fire();

2、采用aop的方式进行扩展方法功能。

// 原方法var sum = function (a, b, c) {  var arr = Array.prototype.slice.call(arguments);  var s = 0;  for (let i = 0; i < arr.length; i++) {    s += arr[i];  }  return s;}// 对所有方法原型上增加after方法,可以包装一个方法,并且扩展方法执行后的功能。Function.prototype.after = function (fn) {  var self = this;  return function () {    var res = self.apply(this, arguments);    fn.apply(this, arguments);    return res;  }}// 对所有方法原型上增加before方法,可以包装一个方法,并且扩展方法执行前的功能。Function.prototype.before = function (fn) {  var self = this;  return function () {    // fn.apply(this,arguments);    if (fn.apply(this, arguments) === false) {      return;    }    var res = self.apply(this, arguments);    return res;  }}// 测试var decoratorFn1 = sum.before(function (...param) {  console.log(param);  console.log('准备开始相加!');  if (param.length < 2) {    return false  }});var res = decoratorFn1(1);console.log(res);

二、责任链

js 责任链,责任链模式,是由很多对象由每一个对象对其下家的引用而连接起来形成一条链。

一般由实现filter的chain类,组装和控制多个filter的执行

// 1、定义Chain,内部有一个filtes数组用来装拦截器var Chain = function () {  this.filters = []; }// 添加filterChain.prototype.setFilter = function (fn) {  this.filters.push(fn);  return this;}// 执行责任链Chain.prototype.doChain = function (request) {  if (this.filters.length > 0) {    var filter = this.filters.shift();    filter.doChain(request, this); // 核心点:将chain传递给下一个filter,那么下一个filter执行就可以执行chain.doChain(request,chain),取下一个拦截器。  }}// 过滤器1var filter1 = {  doChain: function (request, chain) {    request.msg =  request.msg + ':one';    chain.doChain(request);  }}// 过滤器2var folter2 = {  doChain: function (request, chain) {    request.msg = request.msg + ':two';    chain.doChain(request);  }}// 2,进行测试var req = { msg: '初始信息' };var chains = new Chain();chains.setFilter(filter1);chains.setFilter(folter2);chains.doChain(req, chains);console.log(req.msg);

三、状态模式

状态模式依赖于其状态的变化时其内部的行为发// 生变化,将动作委托到代表当前状态的对象,对外表现为类发生了变化。var Light = function () {  this.currState = FSM.off;}Light.prototype.change = function () {  this.currState.handle(this);};// 有限状态机 (finite state machine)var FSM = {  on: {    handle: function (light) {      console.log('开')      light.currState = FSM.off;    }  },  off: {    handle: function (light) {      console.log('关')      light.currState = FSM.on;    }  }}var light = new Light();light.change();light.change();light.change();

 

 

转载地址:http://ceuni.baihongyu.com/

你可能感兴趣的文章
iOS 关于pods-frameworks.sh:permission denied报错的解决
查看>>
设置tabbaritem的title的颜色及按钮图片
查看>>
动态设置label的高度
查看>>
获取 一个文件 在沙盒Library/Caches/ 目录下的路径
查看>>
图片压缩
查看>>
检测缓存文件是否超时
查看>>
十进制字符串转十六进制字符串
查看>>
属性字符串(富文本)的使用
查看>>
cell上label的背景颜色在选中状态下改变的解决办法
查看>>
GPS定位
查看>>
地图、显示用户位置、大头针
查看>>
自定义大头针
查看>>
UIButton添加block点击事件
查看>>
利用runtime给类别添加属性
查看>>
本地推送
查看>>
FMDB的使用
查看>>
UIImage存为本地文件与UIImage转换为NSData
查看>>
[转]打印质数的各种算法
查看>>
[转]javascript with延伸的作用域是只读的吗?
查看>>
php的autoload与global
查看>>