デザインパターン Adapter(Wrapper):包んで再利用

概要

あるオブジェクトを受け取るメソッドがある場合に、
必要なメンバーを持っていないオブジェクトにメンバーを継承させる、
接続用オブジェクトを介してオブジェクトをやり取るするパターン
本例ではPrintインターフェイス、Bannerクラスは変更できないと仮定して、
それを用いる実装を行う為に新しく両者を結合できる様、PrintBannerクラスをAdapterとして用いている

継承パターン

クラス図

adapter1

Adapter:PrintBanner
Adaptee:Banner

コード

public class Banner
{
  private string myString_;
  public Banner(string prmString)
  {
    this.myString_ = prmString;
  }
  public void showWithParen()
  {
    Console.WriteLine( "(" + this.myString_ + ")" );
  }
  public void showWithAster()
  {
    Console.WriteLine( "*" + this.myString_ + "*" );
  }
}

public interface Print
{
  void printWeak();
  void printStrong();
}

public class PrintBanner : Banner implements Print
{
  //基底クラス(Banner)のコンストラクタ呼び出し
  public PrintBanner(string prmString) : base(prmString: prmString){}
  public void printWeak()
  {
    //基底クラスのメソッド呼び出し
    base.showWithParen();
  }
  public void printStrong()
  {
    //基底クラスのメソッド呼び出し
    base.showWithAster();
  }
}

class Program
{
  static void Main(string[] args)
  {
    //Printインターフェイスを使用
    Print p = new PrintBanner(prmString: @"Hello");
    p.printWeak();
    p.printStrong();
    ※PrintBannerクラス(Adapter)が実装しているBannerクラス(Adaptee)のメソッドが隠されている。
    =Adapterを用いてAdapteeの機能を利用している
  }
}

委譲パターン

クラス図

adapter2

コード

public class Banner
{
  private string myString_;
  
  public Banner(string prmString)
  {
    this.myString_ = prmString;
  }
  public void showWithParen()
  {
    Console.WriteLine( "(" + this.myString_ + ")" );
  }
  public void showWithAster()
  {
    Console.WriteLine( "*" + this.myString_ + "*" );
  }
}
// interface ⇒ class
public abstract class Print
{
  public abstract void printWeak();
  public abstract void printStrong();
}
public class PrintBanner : Print
{
  private Banner banner_;
  public PrintBanner(string prmString)
  {
    this.banner_ = new Banner(prmString: prmString);
  }
  public void printWeak()
  {
    this.banner_.showWithParen();
  }
  public void printStrong()
  {
    this.banner_.showWithAster();
  }
}
class Program
{
  static void Main(string[] args)
  {
    Print p = new PrintBanner(prmString: @"Hello");
    p.printWeak();
    p.printStrong();
  }
}