23种设计模式之适配器模式(Adapter Pattern)
适配
即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。
例如:二转换为三箱插头,将高电压转换为低电压等。
动机(Motivate):
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式。
意图(Intent):
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
-------《设计模式》GOF
抽象的 UML 类图
4 种角色:Adaptee(被适配),Adapter(适配者),Client(使用场景),Target(目标对象)。
Adaptee(被适配):不是 -er 结尾的哦,之前的 Portal(入口)类作为被适配者。
Adapter(适配者):作为 Adaptee 和 Target 的媒介,进行调节。
Client(使用场景):一个调用的入口,以 Main() 作为入口函数。
Target(目标对象):调节(适配)后的输出,之前的 IOutput 接口和 Export 类都是作为 Target 对象。
图:类适配器(使用继承)
图:对象适配器(使用委托)
1 /// <summary> 2 /// 数据访问接口 3 /// </summary> 4 public interface IHelper 5 { 6 void Add<T>(); 7 void Delete<T>(); 8 void Update<T>(); 9 void Query<T>(); 10 }
1 public class MysqlHelper : IHelper 2 { 3 public void Add<T>() 4 { 5 Console.WriteLine("This is {0} Add", this.GetType().Name); 6 } 7 public void Delete<T>() 8 { 9 Console.WriteLine("This is {0} Delete", this.GetType().Name); 10 } 11 public void Update<T>() 12 { 13 Console.WriteLine("This is {0} Update", this.GetType().Name); 14 } 15 public void Query<T>() 16 { 17 Console.WriteLine("This is {0} Query", this.GetType().Name); 18 } 19 }