JavaScript门面模式详解


Posted in Javascript onOctober 19, 2017

外部与一个子系统的通信必须通过一个系统的一个门面对象进行,这就是门面模式。

门面模式具备如下两个角色:

1. 门面角色

客户端可以调用这个角色方法,此角色中有子系统的应用(知晓相关的(一个或多个)子系统的功能和责任)。本角色会将所有从客户端发来的请求委派到相应的子系统去。

2. 子系统角色

可以同时有一个或多个子系统。每一个子系统都不是一个单独的类,而是一些类的集合。每一个子系统都可以被客户端直接调用(这样客户端代码会多),或被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另一个客户端而已。

 下面我们来看一个可以提现门面模式的简单需求:主人为自己的宠物狗办理的相应的宠物领养证件

从这个简单的需求中我们可以大致分析出我们需要:主人Person类和宠物狗Dog类 的一些相关信息

在下面的例子中国会涉及到接口的验证,现在先将代码贴出来

//(定义一个静态方法来实现接口与实现类的直接检验
//静态方法不要写出Interface.prototype ,因为这是写到接口的原型链上的
//我们要把静态的函数直接写到类层次上
//定义一个接口类
var Interface=function (name,methods) {//name:接口名字
  if(arguments.length<2){
    alert("必须是两个参数")
  }
  this.name=name;
  this.methods=[];//定义一个空数组装载函数名
  for(var i=0;i<methods.length;i++){
    if(typeof methods[i]!="string"){
      alert("函数名必须是字符串类型");
    }else {
      this.methods.push( methods[i]);
    }
  }
};
Interface.ensureImplement=function (object) {
  if(arguments.length<2){
    throw new Error("参数必须不少于2个")
    return false;
  }
  for(var i=1;i<arguments.length;i++){
    var inter=arguments[i];
    //如果是接口就必须是Interface类型
    if(inter.constructor!=Interface){
      throw new Error("如果是接口类的话,就必须是Interface类型");
    }
    //判断接口中的方法是否全部实现
    //遍历函数集合
    for(var j=0;j<inter.methods.length;j++){
      var method=inter.methods[j];//接口中所有函数

      //object[method]传入的函数
      //最终是判断传入的函数是否与接口中所用函数匹配
      if(!object[method]||typeof object[method]!="function" ){
      //实现类中必须有方法名字与接口中所用方法名相同
        throw new Error("实现类中没有完全实现接口中的所有方法")
      }
    }
  }
}

(1)主人类(Person类)

function Person() {
   this.name="测试";
   this.address="居住在中国";
   this.getInfo=function () {
     return "名字"+this.name+" 地址"+this.address;
   };
   this.learn=function () {
     alert("学习的方法");
   }
    this.marray=function () {
      alert("marray");
    }
   //验证接口
    Interface.ensureImplement(this,PersonDao);//验证该类是否全部实现接口中的方法
  }

(2)宠物狗(Dog类)

var DogDao=new Interface("DogDao",["getInfo","call","run"]);

  var Dog=function () {
    this.name="gg";
 this.getInfo=function () {
   return "狗狗的名字"+this.name;
 };
 this.call=function () { };
 this.run=function () {};
 Interface.ensureImplement(this,DogDao);//验证接口
  }

(3)现在可以主人可以给自己的宠物狗办理宠物领养证件了   -----客户端代码

 第一种方法:不用门面的方式客户端的代码如下

function action(person,dog) {
  var r="GG"+new Date().getDay()+Math.floor(Math.random()*11);
  var str="办证成功:编号"+r
   +"<br/>主人信息"+person.getInfo()
  +"<br>狗狗的信息:"+dog.getInfo();
  return str;
}document.write(action(new Person(),new Dog()));

第二种方法:使用门面模式-----将复杂的事交给门面来做,客户端压力可以减小

  #1:门面中进行如下的处理

function facade(person,dog) {
   var r="GG"+new Date().getDay()+Math.floor(Math.random()*11);
   var str="办证成功:编号"+r
     +"<br/>主人信息"+person.getInfo()
     +"<br>狗狗的信息:"+dog.getInfo();
   this.action=function () {//相当于实例的方法
     return str;
   };
 }

#2:客户端负责使用的代码为

function action2(person,dog) {
   document.write(new facade(person,dog).action());
}
action2(new Person(),new Dog());

总结,我们可以看出不适用门面模式的客户端需要处理较为复杂的业务,使用门面后,在门面中处理复杂的东西,而客户端只需要简单的调用即可。

 一个简单理解门面模式的图结构:

JavaScript门面模式详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
JavaScript实现给按钮加上双重动作的方法
Aug 14 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
Jan 21 Javascript
JS实现数组去重复值的方法示例
Feb 18 Javascript
angular 动态组件类型详解(四种组件类型)
Feb 22 Javascript
原生js实现密码输入框值的显示隐藏
Jul 17 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
Mar 17 Javascript
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
vue+Java后端进行调试时解决跨域问题的方式
Oct 19 #Javascript
AngularJS的$location使用方法详解
Oct 19 #Javascript
vue-cli 自定义指令directive 添加验证滑块示例
Oct 19 #Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 #Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
Oct 19 #jQuery
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
Oct 19 #jQuery
浅谈Node Inspector 代理实现
Oct 19 #Javascript
You might like
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
实战node静态文件服务器的示例代码
2018/03/08 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
js实现星星打分效果
2020/07/05 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
jQuery实现tab栏切换效果
2020/12/22 jQuery
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
python中实现控制小数点位数的方法
2019/01/24 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
python计算无向图节点度的实例代码
2019/11/22 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
小学语文国培感言
2014/03/04 职场文书
社区维稳工作方案
2014/06/06 职场文书
婚内分居协议书范文
2014/11/26 职场文书
北京导游词
2015/02/12 职场文书
赢在中国观后感
2015/06/02 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书