私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
プロキシ パターンは、プロキシ オブジェクトを導入することで別のオブジェクトへのアクセスを制御する構造的な設計パターンです。このプロキシ オブジェクトは、アクセス制御、遅延初期化、ロギング、ネットワーク アクセスなどの追加機能をプロキシ オブジェクトに提供できます。
リモートエージェント:
仮想エージェント:
保護剤:
スマートな誘導:
以下は、プロキシ パターンの簡単な実装例で、プロキシ オブジェクトを通じて実際のオブジェクトへのアクセスを制御する方法を示しています。
public interface Subject {
void request();
}
Subject
インターフェースは、request
メソッド。これは、実際のオブジェクトとプロキシ オブジェクトの両方が実装する必要があるメソッドです。public class RealSubject implements Subject {
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
RealSubject
実装されたクラスSubject
インターフェースrequest
実際にリクエストを処理するクラスを表すメソッド。public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
public void request() {
if (this.checkAccess()) {
this.realSubject.request();
this.logAccess();
}
}
private boolean checkAccess() {
// 检查访问权限
System.out.println("Proxy: Checking access prior to firing a real request.");
return true;
}
private void logAccess() {
// 记录请求日志
System.out.println("Proxy: Logging the time of request.");
}
}
Proxy
実装されたクラスSubject
インターフェースを持ち、RealSubject
物体。request
このメソッドでは、プロキシ クラスは最初にアクセス許可をチェックし、次に実際のオブジェクトのrequest
メソッドを実行し、最後にリクエスト ログを記録します。public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Proxy proxy = new Proxy(realSubject);
proxy.request();
}
}
Client
クラスが作成されましたRealSubject
そしてProxy
オブジェクト、を通してProxy
オブジェクト呼び出しrequest
を制御する方法RealSubject
アクセス。分離:
安全性:
スケーラビリティ:
知的:
コードの複雑さ:
反応時間:
設計の難易度:
Client
|
v
Subject <---- Proxy <---- RealSubject
プロキシ パターンは、オブジェクトへのアクセスを制御および管理する効率的な方法を提供します。プロキシを使用すると、ビジネス オブジェクトの責任を明確にしたまま、さまざまな機能を追加できます。このモードは、ビジネス オブジェクトに対するアクセス制御やその他の前処理操作が必要なシナリオに特に適しています。
ファサード パターンは、サブシステム内のインターフェイスのグループにアクセスするための統一インターフェイスを提供することで、複雑なサブシステムを使いやすくする構造設計パターンです。ファサード パターンは、このサブシステムを使いやすくする高レベルのインターフェイスを定義します。
複雑なシステムへのインターフェースを簡素化:
階層:
分離されたシステム:
以下は、ファサード パターンの簡単な実装例であり、ファサード クラスを通じてサブシステムの使用を簡素化する方法を示しています。
public class SubsystemA {
public void operationA() {
System.out.println("SubsystemA: operationA");
}
}
public class SubsystemB {
public void operationB() {
System.out.println("SubsystemB: operationB");
}
}
public class SubsystemC {
public void operationC() {
System.out.println("SubsystemC: operationC");
}
}
public class Facade {
private SubsystemA subsystemA;
private SubsystemB subsystemB;
private SubsystemC subsystemC;
public Facade() {
this.subsystemA = new SubsystemA();
this.subsystemB = new SubsystemB();
this.subsystemC = new SubsystemC();
}
public void operation1() {
System.out.println("Facade: operation1");
subsystemA.operationA();
subsystemB.operationB();
}
public void operation2() {
System.out.println("Facade: operation2");
subsystemB.operationB();
subsystemC.operationC();
}
}
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.operation1();
facade.operation2();
}
}
サブシステムクラス:
SubsystemA
, SubsystemB
、 そして SubsystemC
サブシステムの固有の実装クラスであり、クラスごとに独自の操作メソッドを持ちます。外観クラス:
Facade
クラスはサブシステム オブジェクトを保持し、簡素化されたインターフェイスを提供しますoperation1
そしてoperation2
サブシステム関数を呼び出します。クライアントコード:
Client
合格したクラスFacade
呼び出すクラスoperation1
そしてoperation2
したがって、複雑なサブシステムの使用が簡素化されます。簡素化されたインターフェース:
疎結合:
より良いレイヤリング:
開閉原理に従わない:
パフォーマンスの問題が発生する可能性がある:
Client
|
v
Facade ----> SubsystemA
----> SubsystemB
----> SubsystemC
Facade パターンは、簡素化されたインターフェイスを提供することで、複雑なサブシステムの操作を容易にします。これは、サブシステム インターフェイスを簡素化し、クライアントとサブシステム間の直接対話を減らし、システム階層を分離する必要があるシナリオに適しています。オープンクローズの原則に違反する可能性がありますが、ほとんどの場合、その利点が欠点をはるかに上回り、システム設計がより明確になり、保守が容易になります。