モチベーション(動機)
ソフトウェアシステムでは、アプリケーションによる環境の変化に、多くの場合、我々は、新しい環境のアプリケーション上で、「既存のオブジェクトの一部」、新しい環境要件である必要はなく、これらのインタフェースは、既存のオブジェクトに満足していません。
この「移行の変更」をどのように扱いますか?新しいインターフェイスが必要なアプリケーション環境を満たすためにしながら、既存のオブジェクトの良い使用の両方を達成するためにどのように?
テント(意図)
クライアントは別のインターフェイスを期待していたクラスのインタフェースを変換します。Adapterパターンは、そうでないため、互換性のないインタフェースのこれらのクラスが一緒に働くことができない一緒に動作するようになります。
サンプルアプリケーションは、アダプタを語ります
これは、実際に呼び出し1つのデリゲートで、もともとMyStackにリクエストを送信しますが、MyStackは実際に対処するために一覧表示するには委任されました。ここMyStackは実際アダプタ(アダプタオブジェクト)、Adaptee(適応対象)であるリストである、とIStack顧客の期待インターフェースです。あまりにも直接的な、何も言うこと。
構造(構造)
アダプターは、二つの構造を持っています
-1オブジェクトアダプタ(より一般的)
上記の例のリストで、すなわち、オブジェクトプログラムの組み合わせを使用して、およびアダプタとの関係は、Adaptee組合せ関係であるオブジェクトアダプタはMyStackと組み合わせ関係です。
OO優先的に組み合わせたモードが適用されない、コンビネーションモードで使用される、継承を考えます。組み合わせモードは、より緩やかに結合されているので、密結合と継承は、すべての変更は、親クラスのサブクラスの変化につながるはずです。
上記の例では、オブジェクト・アダプタです。
-2、クラスアダプタ
以下の例では、アダプタをベースにしています。
アダプタはArrayListの、また継承IStackインタフェースを継承し、両方のArrayListの方法において使用することができる、IStack方法も使用することができるインターフェースを、あなたはほとんど目立た感じます。このクラスは、単一の責任を持つべきクラスの原則に違反し、それはそう、このクラスの適応は、それが推奨されていない、非常に一般的ではない、責任のArrayListでなく、責任IStackの両方を持っています。
注意:この方法は、2つの以上のオブジェクト、または二つ以上のクラスに委託する必要がある場合にのみ、アダプターの内部で実現することができるいくつかのプロパティを追加する必要があり、オブジェクトアダプタを委任する必要があります。
C#クラスは単一継承できるため、クラスアダプタの場合、それは2から継承することはできません以上の二つのクラスよりも、クラスのアダプタは、ここでは使用されません。
アプリケーション:
实现一个对栈的操作,有一个IStact接口,里面有三个方法Push(进栈)、Pop(出栈)和GetTopItem(取最顶层元素),这个IStact接口将相当于上面的Target,想要实现进栈出栈的操作,如果自己去实现数据结构显得比较麻烦,在此可以将net提供的ArrayList类拿来一用,ArrayList类就是被适配的对象,相当于上面的Adaptee。在写一个适配类StactAdapter类完成功能就可以了。
/// <summary> /// 栈的接口 /// </summary> public interface IStack { void Push(object item); void Pop(); Object GetTopItem(); } /// <summary> /// 对象适配器 /// </summary> public class StactAdapter : IStack { ArrayList list; /// <summary> /// 构造函数中实例化ArrayList /// </summary> public StactAdapter() { list = new ArrayList(); } /// <summary> /// 进栈 /// </summary> /// <param name="item">压入栈的元素</param> public void Push(object item) { list.Add(item); } /// <summary> /// 出栈 /// </summary> public void Pop() { list.RemoveAt(list.Count - 1); } /// <summary> /// 取最顶层的元素 /// </summary> /// <returns></returns> public Object GetTopItem() { return list[list.Count - 1]; } } /// <summary> /// 客户调用 /// </summary> public class App { static void Main(string[] args) { IStack myStack = new StactAdapter(); myStack.Push("oec2003"); myStack.Push("oec2004"); myStack.Push("oec2005 " ); myStack.Pop(); Console.WriteLineを(myStack.GetTopItem()); } }
いくつかのポイントのアダプタモデル
アダプタモードは、主に使用されている「既存のクラスの一部を再利用したいのですが、インターフェースおよび多重化環境要件の場合矛盾に」再利用レガシーコードの移行ライブラリは非常に便利です。
クラス・オブジェクト・アダプタとアダプタの2つのモードアダプタの構造を定義GoF23。しかし、クラスのアダプタは、実装の「多重継承」を使用して、貧しい高い結合を持っていた、それが一般的に推奨されていません。疎結合の精神に沿って、より多くの「オブジェクトの組み合わせ」を介してオブジェクトアダプタ、。
アダプタパターンを実現することができる非常に柔軟で定義GoF23二つの構造に限定されません。例えば、パラメータインターフェースの新しい方法として、「オブジェクトを既存の」アダプタモードは、目的を達成するように適合することができます。
アダプタモデル自体は簡単に後の段階で適合するように、できるだけ多くの「インターフェイス指向プログラミング」スタイルを使用するように私たちを必要とします。