デザインパターン Adapter(Wrapper):包んで再利用
概要
あるオブジェクトを受け取るメソッドがある場合に、
必要なメンバーを持っていないオブジェクトにメンバーを継承させる、
接続用オブジェクトを介してオブジェクトをやり取るするパターン
本例ではPrintインターフェイス、Bannerクラスは変更できないと仮定して、
それを用いる実装を行う為に新しく両者を結合できる様、PrintBannerクラスをAdapterとして用いている
継承パターン
クラス図
Adapter:PrintBanner
Adaptee: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の機能を利用している
}
}
委譲パターン
クラス図
コード
{
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();
}
}