出典:https://www.cnblogs.com/wyy1234/
カタログを読みます
1.はじめにアダプタモード
アダプタの動作モードがあるクラスのインタフェース、別の目的のクライアントインタフェースに変換され、生のインタフェースアダプタ(私たちのクラス固有の機能)とターゲット・インタフェース(クライアント所望の機能)と、の間のブリッジ。例えば:私たちはアンドリュースデータラインはアップルに携帯電話を充電することができないことを知っているが、我々はアップルのデータラインを持っていない、あなただけの充電にデータケーブルアンドリュースアップルの携帯電話を使用することができ、その後、どのようにそれを解決するには?それに頭を変換することで、これは、変換されたヘッドアダプタです。アダプタモードでは:アンドリュースデータラインは、私たちの現在のクラスで、充電機能は、アンドリュースデータラインですが、(Appleの携帯電話の充電に)新しい環境に互換性がないためのインターフェースとしての機能を充電するので適して、iPhoneやAndroidなどのアダプタデータラインの間のブリッジ、そのので、オリジナルの課金機能(Appleの携帯電話の充電に)新しい環境で使用されます。
アダプタモードの2種類があります:アダプタクラスとオブジェクトアダプタ、アダプタクラスが一致するインタフェースを実現するために、複数の継承によって、C#が多重継承をサポートしていません、私たちは考えていません。私たちは、オブジェクトアダプタをご紹介します。最初の3つの役割アダプタモードを導入しました:
Adaptee:最初の役割は、私たちが使用したい機能を実現するために、しかし、インターフェースは一致していません。
ターゲット:ターゲットの役割は、クライアントの期待インタフェースを定義します
アダプタ:ターゲット・インタフェースを達成するためのアダプター役割。ターゲット・インタフェースを達成するための方法は、以下のとおりです。内部は元のオブジェクトの呼び出しによってターゲット・インタフェース・メソッドAdapteeを達成するためにAdapteeオブジェクトが含まれています。(注:これはオブジェクトアダプタであること)
我々は、例えば、充電ケーブルアンドリュースアップルの携帯電話にそれを与えるの下には、利用状況のアダプタパターンを説明し、コードは非常に簡単です
3つの役割:
/// <summary> /// 安卓数据线,adaptee角色 /// </summary> public class AndroidLine { public void AndroidCharge() { Console.WriteLine("安卓数据线充电...."); } } /// <summary> /// 苹果手机充电接口,目标接口 /// </summary> public interface IApplyCharge { void ApplyChange(); } /// <summary> /// 苹果适配器 适配器角色 /// </summary> public class ApplyAdapter : IApplyCharge { AndroidLine androidLine = new AndroidLine();//适配器内部包含一个Adaptee对象 public void ApplyChange() { androidLine.AndroidCharge();//客户端调用时,表面上是用的是ApplyChange方法,本质还是用的AndroidCharge方法 } }
客户端调用:
class Program { static void Main(string[] args) { //获取一个target的实例 IApplyCharge applyAdapter = new ApplyAdapter(); applyAdapter.ApplyChange();//表面上用的苹果充电方法ApplyChange,本质上还是用的安卓充电方法AndriodChange。 Console.ReadKey(); } }
运行程序如下:
2.小结
上边例子的类图:
适配器的使用场景:
系统想使用一个类,但是这个类的接口不符合系统的要求时使用适配器模式。
适配器模式的优点:
1.提高代码复用,复用了Adaptee中的方法
2.灵活性好,如没有关联的两个类A和类B,类A想借用类B的方法,可以在类A中添加一个类B的实例,然后调用类B实例的方法即可。
适配器模式的缺点:
1.过多使用适配器会让会同凌乱,如我们明明调用的是A接口的功能,但是却被适配成了B接口的功能。