15.「インターフェース分離モード」のプロキシモード

1. 動機

  • オブジェクト指向システムでは、何らかの理由 (たとえば、オブジェクト作成のオーバーヘッドが非常に高い、一部の操作でセキュリティ制御が必要、プロセス外アクセスが必要など) により、直接アクセスすると問題が発生します。ユーザーやシステムの構造に問題があり、多くのトラブルが発生します。
  • オブジェクトに対する操作の透明性を失うことなく、これらのオブジェクトに固有の複雑さを管理/制御するにはどうすればよいでしょうか? 間接層の追加は、ソフトウェア開発における一般的な解決策です。

2. スキーマ定義

        このオブジェクトへのアクセスを制御 (分離、インターフェイスの使用) するための他のオブジェクトのプロキシを提供します。

                                                                                                                ----《デザインパターン》GOF

3. 構造

クライアントは RealSubject を使用する必要があります。通常の状況では、クライアントは Subject ポインタを宣言してから新しい RealSubject を宣言する必要がありますが、前述のセキュリティ上の考慮事項やアクセス制御などの特定のシーン制限により、新しい RealSubject に直接移動することはできません。特定のオブジェクトの場合、現時点では、Proxy を使用して Cline に Proxy オブジェクトを生成させ、Proxy 内でいくつかの追加操作を実行させ、RealSubject インターフェイスを動員することができます。 

4. コード例

オリジナルコピー:

        

class ISubject{
public:
    virtual void process();
};

class RealSubject : public ISubject{
public:
    virtual void process(){
     //...
     // ...   
    }
};


class ClientApp{
    ISubject *subject;
public:
    ClientApp()
    {
        subject = new RealSubject();
    }
    void DoTask(){
        // ...
        subject->process();
        // ...
    }
};

しかし、何らかの理由で、サブジェクトは新しい RealSubject の方法に直接従うことができません。

コードVer2:

class SubjectProxy : public ISubject{
    ISubject *subject;
public:
    virtual void process(){
     //...
     // 对RealSubject的一种间接访问
     subject->process();
     // ...   
    }
};

class ClientApp{
    ISubject *subject;
public:
    ClientApp()
    {
        subject = new SubjectProxy();
    }
    void DoTask(){
        // ...
        subject->process();
        // ...
    }
};

上記Ver2のサンプルコードでは、プロキシモードでRealSubjectポインタを保持していますが、一般的にはこのような使い方ではなく、より複雑な使い方が考えられますが、このような使い方も可能です。

4. 要点のまとめ

  • 「間接層の追加」は、ソフトウェア システムにおける多くの複雑な問題に対する一般的な解決策です。オブジェクト指向システムでは、一部のオブジェクトを直接使用すると多くの問題が発生します。この問題を解決するには、間接層としてプロキシ オブジェクトを使用するのが一般的です。
  • 特定のプロキシ モードの実装方法と粒度は大きく異なります (つまり、上記の ver2 コードの SubjectProxy の処理方法)。コピー オン ライト テクノロジなど、オブジェクトをきめ細かく制御できるものもあれば、コンポーネントモジュールの抽象化を提供する プロキシ層、アーキテクチャレベルでオブジェクトをプロキシする

        (コンポーネント モジュールに抽象プロキシ層を提供し、アーキテクチャ レベルでオブジェクトのプロキシ処理を説明するものもあります。分散システムなどでは、多数のプロキシ モードが使用されます。たとえば、WebService にアクセスしたいとします。この WebServiceたとえば、Amazon の webService です。現在非常に人気のある Rust アーキテクチャを含むそれにアクセスすると、Sina、Weibo、amazon、WeChat のいくつかの Rust インターフェイスなどの Rust インターフェイスが得られ、C++ でアクセスすると、特定のツールが存在することがよくあります。クライアント側でそのインターフェイスのプロキシ クラスを生成します。プロキシ クラスは、多くの場合、手動で記述されませんが、ツールによって自動的に実装されます。すべてのネットワーク アクセスの詳細を制御する必要があるため、手動での記述は非常に複雑です)

  • プロキシは必ずしもインターフェイスの完全な一貫性を維持する必要はなく、間接的な制御が達成できる限り、ある程度の透明性が損なわれても許容される場合があります。

おすすめ

転載: blog.csdn.net/bocai1215/article/details/127642330