×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

C#デザインパターン  - Adapter

ここに掲載したコードは、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』に掲載されているサンプルコードをC#に移植したものです。
解説らしい解説は載せていませんので、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』も合わせてお読みください。

※当ソースは、Visual C# 2008 Express Editionで動作を確認しています。
  Visual Studio 2005をお使いの方は、ブログの記事を残しておきますので、そちらをご覧ください。



■Banner.cs
using System;

namespace Gushwell.DesignPatterns {

// 古いインターフェースのクラス
// IPrintインターフェースに合わせたい
public class Banner {
private string str;

public Banner(System.String str) {
this.str = str;
}

public virtual void ShowWithParen() {
Console.WriteLine("(" + str + ")");
}

public virtual void ShowWithAster() {
Console.WriteLine("*" + str + "*");
}
}
}


■IPrint.cs
using System;

namespace Gushwell.DesignPatterns {

// 新しいインターフェース
public interface IPrint {
void PrintWeak();
void PrintStrong();
}
}

■IPrintBanner.cs
using System;

namespace Gushwell.DesignPatterns {

// Bannerクラスを新しいインターフェースで使えるようにする
// 処理は、すべてBannerに委譲する。
// 後日、Bannerに委譲せずに、処理を行うように書き換えることで、
// Bannerクラスを捨て去ることも可能。
public class PrintBanner : IPrint {
private Banner banner;
public PrintBanner(string str) {
banner = new Banner(str);
}

// こんなコンストラクタを作ってもよいかも。
// そうすれば、Bannerが IOldBannerみたいなインターフェースを
// 実装しているとすると、IOldBannerを実装したすべての
// クラスで、新しいインターフェースを利用できるようになる。
// しかし、Bannerクラスを捨て去ることができなくなる。
public PrintBanner(Banner banner) {
this.banner = banner;
}

public void PrintWeak() {
banner.ShowWithParen();
}

public void PrintStrong() {
banner.ShowWithAster();
}
}
}


■Program.cs
using System;

namespace Gushwell.DesignPatterns {
public class Program {
public static void Main(string[] args) {
// 新しいインターフェースで Bannerを利用する。
IPrint p = new PrintBanner("Hello");
p.PrintWeak();
p.PrintStrong();
Console.ReadLine();

// 独自追加部分
IPrint p2 = new PrintBanner(new Banner("Hello"));
p2.PrintWeak();
p2.PrintStrong();
Console.ReadLine();

}
}
}



もう一つのAdapterの例(Gushwellによる独自実装)

■IOldBanner.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Gushwell.DesignPatterns {
interface IOldBanner {
void ShowWithParen();
void ShowWithAster();
}
}

■OldBanner.cs
using System;

namespace Gushwell.DesignPatterns {

// 古いインターフェースのクラス
// もう中身がぐちゃぐちゃでメンテナンスが無理なので、
// NewBannerクラスを新規に作成し、処理を委譲するように変更した。
public class OldBanner : IOldBanner {
private IBanner banner;
public OldBanner(string str) {
banner = new NewBanner(str);
}

public void ShowWithParen() {
banner.PrintWeak();
}

public void ShowWithAster() {
banner.PrintStrong();
}
}
}

■IBanner.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Gushwell.DesignPatterns {
interface IBanner {
void PrintWeak();
void PrintStrong();
}
}

■Banner.cs
using System;

namespace Gushwell.DesignPatterns {

// 新しいBannerクラス。インターフェースも刷新する。
// OldBannerはメンテナンスせずに、こちらだけをメンテナンス対象とする。
public class NewBanner : IBanner {
private string str;

public NewBanner(System.String str) {
this.str = str;
}

public void PrintWeak() {
Console.WriteLine("(" + str + ")");
}

public void PrintStrong() {
Console.WriteLine("*" + str + "*");
}
}
}

■Program.cs
using System;

namespace Gushwell.DesignPatterns {
public class Program {
// 新しい部品を使いたいが、書き換えるコストが大変。
// しばらくは古いインターフェースのまま使いたい。
public static void Main(string[] args) {
// 古いインターフェースで NewBannerを利用する。
IOldBanner p = new OldBanner("Hello");
p.ShowWithParen();
p.ShowWithAster();
Console.ReadLine();

// もちろん新しいインターフェースでも利用も可能
// 新規にコーディングする部分は新しいインターフェースを利用する。
IBanner p2 = new NewBanner("Hello");
p2.PrintWeak();
p2.PrintStrong();
Console.ReadLine();
}
}
}