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 相关文章推荐
jquery api参考 visualjquery 中国线路 速度快
Nov 30 Javascript
判断复选框是否被选中的两种方法
Jun 04 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
Oct 17 Javascript
原生javaScript实现图片延时加载的方法
Dec 22 Javascript
jQuery中slideUp()方法用法分析
Dec 24 Javascript
JS简单实现点击复制链接的方法
Aug 03 Javascript
Vue2实现组件props双向绑定
Dec 02 Javascript
认识less和webstrom的less配置方法
Aug 02 Javascript
详解vue 项目白屏解决方案
Oct 31 Javascript
图文讲解vue的v-if使用方法
Feb 11 Javascript
解决js中的setInterval清空定时器不管用问题
Nov 17 Javascript
vue 实现click同时传入事件对象和自定义参数
Jan 29 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
php实现mysql同步的实现方法
2009/10/21 PHP
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
JSONP基础知识详解
2017/03/19 Javascript
js实现抽奖效果
2017/03/27 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
Golang与python线程详解及简单实例
2017/04/27 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python 如何对文件目录操作
2020/07/10 Python
Django跨域请求原理及实现代码
2020/11/14 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
社区优秀志愿者材料
2014/02/02 职场文书
大学社团计划书
2014/05/01 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书