iOSのデザインパターンのプロキシモード

まず、プロキシモードは何ですか

  • 定義

    他のオブジェクトへのオブジェクトへのアクセスを制御するためのプロキシを提供します。プロキシデザインパターンの英語名は、Proxyパターンであり、私たちの共通の代表者(代理人)は重要ではありません。

  • で構成プロキシパターン
    抽象的役割:インターフェースや抽象クラス宣言を通じて実装実際のビジネスメソッドの役割。 
    役割演技:抽象的役割を達成するために、エージェントの役割は、実際、抽象メソッドは、役割によって実際のビジネス・ロジック・メソッドを達成するために、そして自分自身の業務を添付することができます。 
    本当の役割は:抽象的な役割を実装し、ビジネスロジック本当の役割を達成することが定義し、役割を演技するために呼び出します。Baiduの百科事典

  • シーンを使用して
    操作細胞などのシリーズをクリックして、私たちはしばしば、それがセルを作成するためにプロキシを使用することであるのiOSのUITableViewを開発するために使用されるように、我々は通常、メッセージパッシングを行うためにプロキシを使用し、iOSの中で

第二に、プロキシ(転送メッセージブローカ実装式)のパターン構成図  

  実装手順

  1. 抽象プロキシクラス(作成AbstractProxy)、およびエージェントを転送するためのメカニズムがメッセージの顧客を定義するために予約されています。
  2. プロキシクラスを作成することは、主に、メッセージ転送エージェントのために使用される抽象(AbstractProxy)サブクラス(ConcreteProxy)から継承します。

  構造図
  

第三に、コードの実装

  • メッセージ転送クラス
    • AbstractProxy.h
      AbstractProxy @interface:NSProxy 
      
      / * * 
       *プロキシオブジェクトである
       * / 
      @Property(非アトミック、弱い)上記IDカスタマー言及; 
      
      / * * 
       プロキシクライアント@breif *を
       顧客に契約のいくつかの種類を達成するために* @paramの顧客
       * @returnプロキシオブジェクト
       * / 
      - (instanceType)initWithCustomer:(上記ID)ユーザーを、
      
      @end
    • AbstractProxy.m
      #importを<にObjC / runtime.h> 
      の#import " AbstractProxy.h " 
      の#import " AbstractExcute.h " 
      
      @implementation AbstractProxy
      
       - (instancetype)initWithCustomer:(ID)顧客{ 
          self.customer = 顧客。
          返す自己を。
      }
      
       - (NSMethodSignature * )methodSignatureForSelector:(SEL)aselector {
           場合([self.customer respondsToSelector:aselector]){
               戻り[methodSignatureForSelector self.customer:aselector]。
          } { 
              AbstractExcute * excute =【AbstractExcute shareInstance]。
              戻る [:NSSelectorFromString(methodSignatureForSelector excute @ " nullExcute:" )]; 
          } 
      }
      
       - (ボイド)forwardInvocation:(NSInvocation * )呼び出し{ 
          
          SELセレクタ = [呼び出しセレクタ]。
          
          もし([self.customer respondsToSelector:セレクタ]){ 
              [呼び出しがsetTarget:self.customer]。
              [呼び出し呼び出し]。
          } { 
              
              NSStringの * selectorString = NSStringFromSelector(invocation.selector)。
              invocation.selector     = NSSelectorFromString(@ " nullExcute:" ); 
              
              AbstractExcute * excute = [AbstractExcute shareInstance]。
              [呼び出しがsetTarget:excute]。
              
              CONST  のchar *クラス名= class_getName([自己クラス])。
              NSArrayの     * classNameArray = nilを; 
              
              もし(self.customer){ 
                  classNameArray = @ [[NSStringのstringWithUTF8String:クラス名]、selectorString、@ "" ]。
              } { 
                  classNameArray = @ [[NSStringのstringWithUTF8String:クラス名]、selectorString]。
              }
              
              [呼び出しsetArgument:&classNameArray atIndex:2 ]。
              [呼び出し呼び出し]。
          } 
      } 
      
      @end
  • ブローカー
    • ConcreteProxy.h
      #importを" AbstractProxy.h " 
      の#import " MessageProtocol.h " 
      
      NS_ASSUME_NONNULL_BEGIN 
      
      ConcreteProxy @interface:AbstractProxy <MessageProtocol> 
      
      @end 
      
      NS_ASSUME_NONNULL_END
    • ConcreteProxy.m
      #importを" ConcreteProxy.h " 
      
      @implementation ConcreteProxy 
      
      @end
  • 例外ハンドラ
    • AbstractExcute.h
      #importを<ファンデーション/ Foundation.h> 
      
      NS_ASSUME_NONNULL_BEGIN 
      
      @interface AbstractExcute:NSObjectの
      
       + (instancetype)shareInstance。
      
      @end 
      
      NS_ASSUME_NONNULL_END
    • AbstractExcute.m
      #importを" AbstractExcute.h " 
      
      @implementation AbstractExcute
      
       + (instancetype)shareInstance {
           静的   AbstractExcute * sharedAbstractExcute = ゼロ、
          静的dispatch_once_t述語。
          dispatch_once( 述語、^ { 
              sharedAbstractExcute = [自己ALLOC] INIT]; 
          }); 
          返すsharedAbstractExcuteを。
      }
      
       - (ボイド)nullExcute:(にNSArray * )クラス名{
           場合(className.count == 3 ){ 
              のNSLog(@ " %@设置了代理、但该代理没有实现%@方法"、クラス名は、[ 0 ]、クラス名は[ 1 ]); 
          } { 
              のNSLog(@ " %の@プロキシが設定されていない場合、方法は、%@を実装していない"、クラス名[ 0 ]、クラス名[ 1 ]); 
          } 
      } 
      
      @end
  • 例外ハンドラ
    • ViewController.h
      #import <UIKitの/ UIKit.h> 
      
      @interface ViewControllerを:のUIViewController 
      
      @end
    • ViewController.m
      #importを" ViewController.h " 
      の#import " MessageProtocol.h " 
      の#import " ConcreteProxy.h " 
      
      のViewController @interface() <MessageProtocol> 
      
      @property(アトミック、強い)ConcreteProxy *のプロキシ。
      
      @end 
      
      @implementationのViewController
      
       - (ボイド)のviewDidLoad { 
          [スーパーのviewDidLoad]。
          
          self.proxy = [[ConcreteProxy ALLOC] initWithCustomer:自己]。
          【self.proxyのhelloWorld]。
          【self.proxy goodByte]。
      }
      
       - (ボイド)のhelloWorld { 
          のNSLog(@」helloWorld " ); 
      }
      
       - (ボイド)goodByte { 
          のNSLog(@" goodByte " ); 
      } 
      
      @end

第四に、長所と短所

  • 長所
    1、明確な責任は:本当の役割は、私は、これらのプロセスがするだけの機関と一致する必要がありますどのように私のための仲介マッチがリストかわからない、結果を知っている限り、すなわち、エージェントの詳細を知る必要はありませんされて私はちょうどリストについては、私がすることができます知っています。 
    2、高いスケーラビリティ 
    たちと実際のプロキシオブジェクトとターゲットオブジェクト間の3は、唯一の仲介者の役割を果たしています。 
    4、デカップリング、プロキシクラスと機関がどのようなお互いを知るために直接必要性を作りました
  • 欠点:エージェントは一から一で、それは委員会および政府機関間の合意が必要です。

V.コード例
  プロキシモード

おすすめ

転載: www.cnblogs.com/lxlx1798/p/11607712.html