ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptファサードパターンの詳細説明

JavaScriptファサードパターンの詳細説明

小云云
小云云オリジナル
2017-12-09 14:47:391417ブラウズ

サブシステムとの外部通信は、システムのファサード オブジェクトを通じて実行する必要があります。これがファサード パターンです。この記事では主に JavaScript ファサード モードに関する情報を詳しく紹介しますので、興味のある方は参考にしていただければ幸いです。

ファサード モードには次の 2 つの役割があります:

1. ファサード ロール

このロールにはサブシステム アプリケーションが存在します (関連する (1 つ以上の) サブシステムの機能を知っています)。と責任)。この役割は、クライアントから送信されたすべてのリクエストを対応するサブシステムに委任します。

2. サブシステムの役割

は、同時に 1 つ以上のサブシステムを持つことができます。各サブシステムは個別のクラスではなく、クラスのコレクションです。各サブシステムは、クライアントによって直接呼び出すことも (これによりクライアント コードが増加します)、またはファサード ロールによって呼び出すこともできます。サブシステムはファサードの存在を知りません。サブシステムにとって、ファサードは単なるクライアントです。

ファサード モデルを現金化するために使用できる簡単な要件を見てみましょう: 飼い主がペットの犬のために申請した、対応するペット養子縁組証明書です

この簡単な要件から、必要なものを大まかに分析できます: 飼い主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) 愛犬(犬カテゴリ)

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()));

2 番目の方法: ファサード モードを使用する-----複雑なことはファサードに任せて、クライアントのプレッシャーを軽減できます

#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());

結論として、ファサードモードに適用されないクライアントは次の処理を行う必要があることがわかります。ファサードを使用した後は、クライアントが単純な呼び出しを行うだけで、複雑な処理をファサードで処理できます。

ファサード パターンを理解するための簡単なグラフ構造:

関連する推奨事項:

PHP のデザイン パターン - ファサード パターン_PHP チュートリアル

Laravel 制御の反転とファサード パターンの概念の詳細な説明

PHPデザインパターンを学ぶPHP実装ファサードパターン(Facade)_PHP

以上がJavaScriptファサードパターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。