适配器模式主要用于系统的升级和维护。或者是新旧系统对接。前提条件是旧系统不能改动源码的情况下。
应用场景:
你去法国旅游、因为国内手机都是220V电压,法国是110V电压,1、你不可能更改你的手机。这个你做不到。2、你不可能更改法国的电路这个更做不到。那办法是什么呢?就是增加一个转换器,把110V转成220V的。以符合你手机充电的要求。这个转换器就是适配器模式
你有一套现成的系统,假如是工厂模式、或者是泛型模式的,系统要求所有产品在系统内正常用都需要符合ISqlHelper接口规范。你有两个产品了。MYSQL\SQLSERVER,这个时候老大命令你增加一个新产品。LUCENE,这个产品不符合ISqlHelper接口规范,1、你不可能更改你的现有系统,这样成本太大,2,LUCENE也是一个现有的产品。你也不能更改。那么如何对接呢?这个时候就要用于适配器模式了。
什么时候需要用适配器模式?
1、比如给旧系统增加一个功能
2、两个旧系统对接
适配器模式有两种实现方法。
1、类适配器
使用端:
static void Main(string[] args) { ISqlHelper sqlAdapter = new SqlServerHelper(); sqlAdapter.add(); sqlAdapter.delete(); sqlAdapter.update(); sqlAdapter.search(); sqlAdapter = new MySqlHelper(); sqlAdapter.add(); sqlAdapter.delete(); sqlAdapter.update(); sqlAdapter.search(); sqlAdapter = new MyLuceneAdapter(); sqlAdapter.add(); sqlAdapter.delete(); sqlAdapter.update(); sqlAdapter.search(); Console.Read(); }
接口端:
interface ISqlHelper { void add(); void delete(); void update(); void search(); }
产品端MYSQL:
public class MySqlHelper : ISqlHelper { public void add() { Console.WriteLine("这里是{0}的add", this.GetType()); } public void delete() { Console.WriteLine("这里是{0}的delete", this.GetType()); } public void search() { Console.WriteLine("这里是{0}的search", this.GetType()); } public void update() { Console.WriteLine("这里是{0}的update", this.GetType()); } }
产品端SQLSERVER:
public class SqlServerHelper : ISqlHelper { public void add() { Console.WriteLine("这里是{0}的add", this.GetType()); } public void delete() { Console.WriteLine("这里是{0}的delete", this.GetType()); } public void search() { Console.WriteLine("这里是{0}的search", this.GetType()); } public void update() { Console.WriteLine("这里是{0}的update", this.GetType()); } }
不兼容的产品MYLUCENE
public class MyLucene { public void add() { Console.WriteLine("这里是{0}的add", this.GetType()); } public void delete() { Console.WriteLine("这里是{0}的delete", this.GetType()); } public void search() { Console.WriteLine("这里是{0}的search", this.GetType()); } }
现在的问题在于,使用端的代码要求所有提供者(MYSQL,SQLSERVER)都符合ISqlHelper接口规范才可以正常使用。但是现在要扩展一个新产品(LUCENE)进来,这个LUCENE不符合ISqlHelper接口规范,这里我们要用适配器来转换一下就OK了。
mylucene适配器。
public class MyLuceneAdapter : MyLucene, ISqlHelper { void ISqlHelper.add() { base.add(); } void ISqlHelper.delete() { base.delete(); } void ISqlHelper.search() { base.search(); } void ISqlHelper.update() { base.delete(); base.add(); } }
2、对象适配器
public class SQLLuceneAdapter { MyLucene mylucene; public SQLLuceneAdapter(MyLucene _mylucene) { mylucene = _mylucene; } public void add() { mylucene.add(); } public void delete() { mylucene.delete(); } public void search() { mylucene.search(); } public void update() { mylucene.delete(); mylucene.add(); } }
使用:
SQLLuceneAdapter sqlobjcet = new SQLLuceneAdapter(new MyLucene()); sqlobjcet.add(); sqlobjcet.delete(); sqlobjcet.update(); sqlobjcet.search();