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 相关文章推荐
Prototype 学习 Prototype对象
Jul 12 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
jQuery插件boxScroll实现图片轮播特效
Jul 14 Javascript
JS中call/apply、arguments、undefined/null方法详解
Feb 15 Javascript
JavaScript表单验证开发
Nov 23 Javascript
详解JavaScript中数组的reduce方法
Dec 02 Javascript
Bootstrap基本模板的使用和理解1
Dec 14 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
VueJs 搭建Axios接口请求工具
Nov 20 Javascript
Layer+Echarts构建弹出层折线图的方法
Sep 25 Javascript
jquery使用echarts实现有向图可视化功能示例
Nov 25 jQuery
springboot+VUE实现登录注册
May 27 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
PHP学习之整理字符串
2011/04/17 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
javascript+mapbar实现地图定位
2010/04/09 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
Python中文编码那些事
2014/06/25 Python
python处理文本文件并生成指定格式的文件
2014/07/31 Python
python逆序打印各位数字的方法
2018/06/25 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
表彰先进集体通报
2014/01/12 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
如何利用python创作字符画
2022/06/25 Python