Adapterパターンは異なるインターフェースを持つクラスをつなげます。イメージ的には形状の異なるもので接続することが出来ない場合、それぞれの間Adapterを入れるで接続することが可能になるものです。接続に必要なインターフェースと既存のインターフェースがずれている時に、インターフェース関連する部分を全て書き直すことのないようにしましょう
AdapterクラスはAdapteeクラスを保持する構造にします。Adapterのメソッドからは、Adapteeクラスのメソッドが 呼び出され実行できるようにします。つまり、Adapterの中でAdapteeの実行が行われます。(委譲)
using System; namespace Adapter { //------------------------------------------------------------------ // デザインパターン (Adapter) // 既存のクラスにメソッド実装追加などの修正を加えることをしたくないとき // Adapterクラスとなるものを新しく作り、そのクラスにメソッドを実装して // 橋渡ししてもらう // //------------------------------------------------------------------- public interface Iappreciate { //音楽を鑑賞することを抽象定義 void Request(); } //InLiveクラスの定義 public class InLive :Iappreciate { public void Request() { Console.WriteLine("生Live中!!バッテリーはびんびん出ぜ♪"); } } //AdapteeOnAirにはIappreciateインターフェースがないため //Request()で実行出来ません //私の持っているspecificRequest()メソッドで何とかならないかな? public class AdapteeOnAir { public void specificRequest() { Console.WriteLine("TV中継中!!バッテリーはびんびん出ぜ♪"); } } //アダプタークラス登場 //私はアダプタークラスです。お悩み解決します。 //specificRequest()メソッドをRequest()メソッドで //動かして見せますぞ。 public class Adapter :Iappreciate { private AdapteeOnAir AdapOnAir; public AdapteeOnAir Adaptee { set{this.AdapOnAir=value;} } public void Request() { //Adapteeに委譲します。 this.AdapOnAir.specificRequest(); } } /// <summary> /// Class1 の概要の説明です。 /// </summary> class Class1 { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main(string[] args) { //通常 Iappreciate nomal =new InLive(); nomal.Request(); //互換 //AdapterにAdapteeをセットします。 Adapter Adap =new Adapter(); Adap.Adaptee=new AdapteeOnAir(); //インターフェースをあわせて実行 Iappreciate extend =Adap; extend.Request(); } } }
1: package adapter; 2: 3: //音楽鑑賞のインターフェース定義 4: public interface Iappreciate { 5: 6: //”演奏を鑑賞する”と定義 7: void request(); 8: 9: }
1: package adapter; 2: 3: //具象ライブの定義 4: public class InLive implements Iappreciate { 5: 6: //ライブでの音楽鑑賞の実装 7: public void request() { 8: 9: System.out.println("生Live中!!バッテリーはびんびんだせ♪"); 10: } 11: 12: }
1: package adapter; 2: 3: public class AdapteeOnAir { 4: 5: //音楽鑑賞の実装 6: public void specificRequest() { 7: System.out.println("TV中継!!バッテリーはびんびんだせ♪"); 8: } 9: 10: }
1: package adapter; 2: 3: public class Adapter implements Iappreciate { 4: 5: 6: private AdapteeOnAir adapteeOnAir; 7: 8: public AdapteeOnAir getAdapteeOnAir() { 9: return adapteeOnAir; 10: } 11: 12: public void setAdapteeOnAir(AdapteeOnAir adapteeOnAir) { 13: this.adapteeOnAir = adapteeOnAir; 14: } 15: 16: //インターフェースをあわせます。 17: public void request() { 18: 19: //委譲による実行(Adapteeが実行します。) 20: this.adapteeOnAir.specificRequest(); 21: } 22: 23: }
1: package adapter; 2: 3: public class StartClass { 4: 5: public static void main(String[] args) { 6: 7: //通常 8: Iappreciate nomal =new InLive(); 9: nomal.request(); 10: 11: //互換 12: //AdapterにAdapteeをセット 13: Adapter adapter =new Adapter(); 14: adapter.setAdapteeOnAir(new AdapteeOnAir()); 15: //インターフェースをあわせて実行 16: Iappreciate extend =adapter; 17: extend.request(); 18: } 19: }
デザインパターン「ひとくちメモ」へ
Homeへもどる