デザインパターン入門

Adapterパターン

一皮かぶせて再利用

どんな場合に使うのか

私たちはいつもゼロからプログラミングするとは限りません。既に存在しているクラスを利用することもよくあります.特にそのクラスが十分にテストされ,バグが少なく,また実際にこれまで使われてきた実績があるのならば,なおさらです.
Adapterパターンは,既存のクラスに一皮かぶせて必要とするクラスを作ります.このパターンによって,必要とするメソッド群を素早く作ることができます.
  • しかし,私たちは,新しいインターフェースに適合させようとするとき,つい「既存」のクラスのソースをいじって「修正」しようと考えてしまいます.でもそれでは,動作テストが済んでいる既存のクラスを,修正後にもう一度テストしなければならなくなってしまいます.
    Adapterパターンは,既存のクラスには全く手を加えずに,目的のインターフェースにあわせようとするものです.
  • PrintBannerクラスがどういうふうに実現されているかをMainクラスは知りません。知らないということは,Mainクラスを全く変更せずにPrintBannerクラスの実装を変えられるということ.

クラス図

継承を使ったもの

委譲を使ったもの

サンプルプログラム

継承を使ったもの

// Banner.cs
using System;
namespace chap02 {
  public class Banner {
    private String str;
    public Banner(String str) {
      this.str = str;
    }
    public void showWithParen() {
      Console.WriteLine("(" + str + ")");
    }
    public void showWithAstar() {
      Console.WriteLine("*" + str + "*");
    }
  }
}

// Print.cs
namespace chap02 {
  public interface Print {
    void printWeak();
    void printStrong();
  }
}

// PrintBanner.cs
namespace chap02 {
  public class PrintBanner : Banner, Print {
    public PrintBanner(string str)
      : base(str) { }
    public void printWeak() {
      showWithParen();
    }
    public void printStrong() {
      showWithAstar();
    }
  }
}

// Program.cs
using System;
namespace chap02 {
  class Program {
    static void Main(string[] args) {
      Print p = new PrintBanner("Hello");
      p.printWeak();
      p.printStrong();
      Console.Read();
    }
  }
}

委譲を使ったもの

// Banner.cs
using System;
namespace chap02 {
  public class Banner {
    private String str;
    public Banner(String str) {
      this.str = str;
    }
    public void showWithParen() {
      Console.WriteLine("(" + str + ")");
    }
    public void showWithAstar() {
      Console.WriteLine("*" + str + "*");
    }
  }
}

// Print.cs
namespace chap02 {
  public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
  }
}

// PrintBanner.cs
namespace chap02 {
  public class PrintBanner : Print {
    private Banner banner;
    public PrintBanner(string str) {
      this.banner = new Banner(str);
    }
    override public void printWeak() {
      banner.showWithParen();
    }
    override public void printStrong() {
      banner.showWithAstar();
    }
  }
}

// Program.cs
using System;
namespace chap02 {
  class Program {
    static void Main(string[] args) {
      Print p = new PrintBanner("Hello");
      p.printWeak();
      p.printStrong();
      Console.Read();
    }
  }
}

デザインパターン入門

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます