C#
 Computer >> コンピューター >  >> プログラミング >> C#

プロキシデザインパターンとは?C#での実装方法を徹底解説

プロキシパターンとは

プロキシ(Proxy)パターンは、GoFデザインパターンのひとつで、別のオブジェクトへのアクセスを制御するための「代理(サロゲート)」または「プレースホルダー」となるオブジェクトを提供します。

プロキシオブジェクトは、元となるオブジェクトとまったく同じ方法で利用できるため、クライアント側は本物のオブジェクトとプロキシの違いを意識することなくコードを書けます。

パターンの構成要素(参加者)

Subject(対象):RealSubject と Proxy の両方に共通するインターフェースを定義します。これにより、RealSubject が期待されるあらゆる場面で Proxy を代わりに使用できるようになります。

RealSubject(実際の対象):プロキシが表す具体的なオブジェクトを定義します。実際の処理を担う本体部分です。

Proxy(代理):RealSubject への参照を保持し、そのアクセスを制御します。RealSubject と同じインターフェースを実装する必要があるため、両者は相互に交換可能です。

どんなときに使うべきか

既存のオブジェクトの定義を変更することなく、その振る舞いを追加・変更したい場合に、プロキシパターンが役立ちます。たとえば、アクセス制御、遅延初期化(Lazy Loading)、ログ記録、キャッシュといった機能を、元のクラスに手を加えずに後から付加できます。

さらに、テストの場面でも非常に有用です。テストダブル(スタブやモック)として、クラスを完全に実装することなくその振る舞いを模倣したいケースなどで活用できます。

C#での実装例

以下は、レストランの注文処理を題材にした C# の実装例です。NewServerProxy クラスが ServerP クラスのプロキシとして機能し、両者は IServerP インターフェースを共有しています。

internal class Program {
    private static void Main(string[] args) {

        NewServerProxy proxy = new NewServerProxy();
        Console.WriteLine("ご注文は何になさいますか? ");
        string order = Console.ReadLine();
        proxy.TakeOrder(order);

        Console.WriteLine("かしこまりました!こちらが " + proxy.DeliverOrder() + " です。");
        Console.WriteLine("お支払い方法はいかがなさいますか?");
        string payment = Console.ReadLine();
        proxy.Processpayment(payment);

        Console.ReadKey();
    }
}

public interface IServerP {
    void TakeOrder(string order);
    string DeliverOrder();
    void Processpayment(string payment);
}

public class ServerP : IServerP {
    private string Order;

    public string DeliverOrder() {
        return Order;
    }

    public void Processpayment(string payment) {
        Console.WriteLine("サーバーが支払いを処理しました:" + payment);
    }

    public void TakeOrder(string order) {
        Console.WriteLine("サーバーが注文を受け付けました:" + order);
        Order = order;
    }
}

public class NewServerProxy : IServerP {
    private string Order;
    ServerP _server = new ServerP();

    public string DeliverOrder() {
        return Order;
    }

    public void Processpayment(string payment) {
        _server.Processpayment(payment);
    }

    public void TakeOrder(string order) {
        Console.WriteLine("サーバーが注文を受け付けました:" + order);
        Order = order;
    }
}

コードのポイント

この例では、IServerP インターフェースが Subject の役割を果たし、実際の処理を行う ServerP クラスが RealSubject、それを包み込む NewServerProxy クラスが Proxy として動作します。

Main メソッドでは NewServerProxy を経由して操作していますが、ServerP を直接使っている場合とまったく同じようにコードが書けている点に注目してください。これこそがプロキシパターンの本質であり、呼び出し側に影響を与えずに内部の挙動を柔軟に差し替えられる強みです。

  1. Paint 3Dとは?基本の使い方とできることを初心者向けに解説

    Windows 10を使っている方なら、最近パソコンに「Paint 3D」という見慣れないアプリがインストールされていることに気づいたかもしれません。一見すると、Windowsに古くから搭載されてきた定番アプリ「ペイント」とよく似た名前ですが、末尾の「3D」は何を意味しているのでしょうか。これは単なるペイントのリニューアル版なのか、それともまったく別のアプリなのでしょうか。 Paint 3Dとは何か Paint 3Dは、MicrosoftがWindows 10向けに無償で配信した大型アップデート「Creators Update」を通じて、多くのユーザーの環境に導入されました。このアップデート

  2. TwitterとFacebookの投稿を時系列順に表示する方法

    Facebookは、家族や友人とのつながりを保ちながら、今何が話題になっているのかを瞬時にチェックできる便利なサービスです。Twitterもまた、文字数制限こそあるものの、自分の思いを発信し、大切な人とコミュニケーションを続けるための優れたプラットフォームといえます。 これらのSNSには、友人がシェアしたコンテンツを表示する「タイムライン」が備わっています。このタイムラインは時代とともに変化を重ね、あらゆる種類のコンテンツが流れるようになり、やがてSNS側が「ユーザーが最も興味を持ちそうな投稿」を優先的に表示する仕組みへと進化していきました。 先駆けてアルゴリズムを変更したのはFaceboo