前回の記事で2つのデザインパターンで楽しい:エージェントモード(Proxyパターン)、我々は代理店モデルは、基本的にコントロールの同じ種類を行うには、クラスへのアクセスのプロセスであることを知っています。
異なるモジュールのプロキシクラスにも、APIを述べた、と同じ前処理を行うためにこれらのAPI、それが将来の負担を軽減することができますがあります。エクステリアモード - このプロセスは、デザインパターンを必要とします。
搬送runoobの説明:
意図:一貫したインターフェース・スキーマのインターフェイスサブシステムのセットを提供するためには、使用するサブシステムが容易になり、高レベルのインターフェイスの外観を定義します。
主なソリューション:クライアントとのインタフェースを簡素化し、複雑なシステムの内部サブシステムにアクセスする際の複雑さを軽減します。
使用するとき: 1を、クライアントは、システムが唯一の「受付」することができを提供し、システム内の複雑なリンクを知っている必要はありません。図2は、入口システムを定義します。
解決方法:クライアントがシステムに接続された外観と同様に、システムに接続されていません。
キーコードは次のとおりです。クライアントの間で複雑なシステムの層を追加し、この層は順序、依存関係やその他の契約を呼び出します。
アスペクトモードは非常に春のJavaのWebシステムに反映されています。パッケージの依存関係を整理し、順序を呼び出しMavenを使って春のクラスは、また、開発者は単にフィルタ(インターセプター)、書かれたMVC 3層構造、複雑な初期化プロセスを呼び出し、そのような依存性の注入など、かなり複雑なプロセスを隠します。これは、モデルの登場です。
Huawei社のクラウドベースのAPIの呼び出しここで、だけでなく、初期化プロセスをカプセル化するためのプロセスと特定のエージェント、唯一の外側のクラスがVPCUtilを取得する操作、またはパッケージビジネス機能自体を実行します。
次のように1で、私たちはそれぞれのビジネスのためのAPIクラスがパッケージングされる場合は、仮想プライベートクラウドAPIクラスは、再びそれをカプセル化し入れ、その後、実装プロセスは以下のとおりです。
バージョン0.2に続く1図TokenProxy剤、クラウドAPIモジュールの動作フローチャートHuawei社
この種のサービストークンの使用は、Huawei社のクラウド身元検証サービスのGETの両方から、同じであるため、実際には、それはまた、再最適化、一緒にAPI 4忠のビジネスパッケージとすることができる(するときに使用します)。
コードプロキシクラスの量を削減するために、我々は、ビジネス・APIクラスのこれら4種類の(のサブクラスとして継承し、SuperUtilクラスを宣言するキーコード):
1 パブリック 抽象 クラスSuperUtil { 2 保護文字列名; 3 保護された文字列のパスワード。 4 保護された文字列トークン。 図5は、 保護された文字列PROJECTIDを。 図6は、 保護された 長いoverDateを。 7 }
これらの属性は、ビジネスクラスを再宣言する必要はありません。
1 パッケージzhyx_cloud。 2 3 インポートjava.lang.reflect.Methodオブジェクト。 4 5 インポートorg.springframework.cglib.proxy.Enhancer。 6 インポートorg.springframework.cglib.proxy.MethodInterceptor。 7 インポートorg.springframework.cglib.proxy.MethodProxy。 8 9 パブリック クラスTokenProxy { 10 11 プライベート VPCUtil VPCProxy = NULL ; 12 13 プライベート ECSUtil ECSProxy = NULL ; 14 15 プライベートSecurityGroupUtil SecurityGroupProxy = nullを。 16 17 プライベート PublicIPUtil PublicIPProxy = nullを。 18 19 プライベートMethodInterceptorのinterceptorFactory(文字列名、文字列のパスワード){ 20 リターン 新しいMethodInterceptorの(){ 21 @Override 22 パブリックオブジェクトインターセプト(オブジェクト・サブ、メソッドのメソッド、オブジェクト[]オブジェクト、MethodProxy methodProxy)がスローされたThrowable { 23 SuperUtil superUtil =を( SuperUtil)副。 24 もし(superUtil.token == nullを|| System.currentTimeMillis()> superUtil.overDate){ 25 TokenAndProjectタップ= 新しいIAMUtil()入手トークン(ユーザ名、パスワード)。 26 VPCUtilのMy Proxy = (VPCUtil)副。 27 myproxy.token = tap.getToken()。 28 myproxy.projectId = tap.getProjectId()。 29 ×1000 = myproxy.overDateのSystem.currentTimeMillis()+ 23 * 60 * 60 。 30 } 31の オブジェクトRES = methodProxy.invokeSuper(サブオブジェクト)。 32の リターンRES。 33 } 34 }。 35 } 36 37 公衆TokenProxy(文字列名、文字列のパスワード){ 38 エンハンサーエンハンサー= 新しいエンハンサー()。 39 enhancer.setSuperclass(VPCUtil。クラス)。 40 enhancer.setCallback(この.interceptorFactory(ユーザ名、パスワード)); 41 この .VPCProxy = (VPCUtil)enhancer.create(); 42 エンハンサー= 新しいエンハンサー()。 43 enhancer.setSuperclass(ECSUtil。クラス)。 44 enhancer.setCallback(この.interceptorFactory(ユーザ名、パスワード)); 45 この .ECSProxy = (ECSUtil)enhancer.create(); 46 エンハンサー= 新しいエンハンサー()。 47 enhancer.setSuperclass(SecurityGroupUtil。クラス)。 48 enhancer.setCallback(この.interceptorFactory(ユーザ名、パスワード)); 49 この .SecurityGroupProxy = (SecurityGroupUtil)enhancer.create(); 50 エンハンサー= 新しいエンハンサー()。 51 enhancer.setSuperclass(PublicIPUtil。クラス)。 52 enhancer.setCallback(この.interceptorFactory(ユーザ名、パスワード)); 53 この .PublicIPProxy = (PublicIPUtil)enhancer.create(); 54 } 55 56 公衆VPCUtil getVPCProxy(){ 57 リターン この.VPCProxy。 58 } 59 60 公衆ECSUtil getECSProxy(){ 61 リターンECSProxy。 62 } 63 64 公衆SecurityGroupUtil getSecurityGroupProxy(){ 65 リターンSecurityGroupProxy。 66 } 67 68 公共PublicIPUtil getPublicIPProxy(){ 69 リターンPublicIPProxy。 70 } 71 72 }
仕事(キーコード後の)が処理され、外部のクラスは、クラスを呼び出し、このクラスでは唯一の4つのサービス機能モジュールによって得ことができ、これらの機能は、検証を繰り返す必要があること、そして、あなたがそれに続くの異なったタイプを追加したい場合直接のハンドル上のプロキシクラスのAPIビジネス・オペレーション(メインソリューション)。
バージョン0.3に続く図2 TokenProxy剤、クラウドAPIモジュールの動作フローチャートHuawei社
利点: 1、システムが相互依存を軽減します。2、柔軟性を向上させます。3、セキュリティを向上させます。
短所:あなたは、物事にあまりにも多くの問題、相続・リライトを変更したい場合は、開閉の原則に準拠していませんが不適切です。(ビジネスAPIの他のタイプがある場合は、プロキシクラスの初期化手順のコードはより複雑になります)
使用シナリオ: 1、モジュールは、複雑なモジュールやサブシステムとして外の世界へのアクセスを提供します。2、比較的独立したサブシステム。図3は、低リスクの人材を防ぐ持参します。
注:階層構造において、システムのエントリ・ファサード・パターンをそれぞれの層を定義することができます。