设计模式 -- 适配器模式
听见适配器这个字眼,应该不会陌生吧,生活中很常见也很容易听到这个东西---适配器。生活中适配器真的很多呢,比如说我们使用笔记本的电源适配器,中国提供的家庭;用电的电压是220v,而笔记本生产厂商如美国却不支持220V电压,所以要在中国使用美国产的笔记本电脑就必须要有电源适配器。就像是下图那个样子,你想使用一个已经存在的类,但是他的接口又不符合要求。
1、什么是适配器模式?
适配器模式将一个类的接口抓换成客户希望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器模式涉及三个重要角色:
目标:定义了客户端使用的与特定领域相关的接口。
被适配者:定义了已经存在的接口,这些接口需要被适配。
适配器:对被适配者接口和目标接口进行匹配。
适配器模式分为两种,一种是类适配器,一种是对象适配器,这两种适配器模式干的是一样的工作,实现上却有点差异。对象适配器采用“组合”实现,适配器要把被适配者作为自己维护的一个对象,然后实现目标接口。类适配器采用多重继承的方法实现,继承自被适配这和目标接口。下面分别是类适配器和对象适配器的类图:
2、如何实现“适配器”模式
实现类适配器模式采用“多重继承”,不需要重新实现整个被适配者,必要的时候可以覆盖被适配者的行为 (继承的好处)。这样的话,类适配的弹性自然小很多。实现对象适配器,采用“组合”,适配器维护一个被适配者的对象,然后用被适配者的方法来实现目标接口。
3、具体示例:
以电源适配器举例说明,家里的插座只提供220V电源,我们需要把它转换为我们的手机可用的充电电源。
类适配器实现:
//220v电源类--需要被适配的类 public class Power { public void get220Vpower() { Console.WriteLine("这是220V电压"); } } //手机充电接口,是直接面向用户的 public interface ITarget { void GetPower();//用户通过接口取得电源 } //类的适配器模式要用多重继承来实现 public class Adapter:Power ,ITarget { public void GetPower()//实现接口里的方法,得到需要的电压 { this.get220Vpower();//取得家用电源电压 Console.WriteLine("得到手机的充电电压");//将其改造成手机的适用电源 } }
对象适配器实现:
//家用电源类--待适配类 class Power { public void Get220vPower() { Console.WriteLine("这是220V家用电源"); } } public interface ITarget { void GetPower(); } //充电器类 -- 适配类 class Adapter:ITarget { Power power;//维护一个被适配的对象 //构造函数--参数:要适配的电源 public Adapter(Power p) { this.power = p; } //适配函数--把要适配的电源改成需要的电源 public void GetPower() { power.Get220vPower(); Console.WriteLine("改造成手机充电电源"); Console.WriteLine("手机可以充电了"); } }
这下应该清晰点了吧?适配器模式实现了被适配者和目标的解耦,依赖于抽象,是一个很好的设计模式。如果你想使用你已经写好的一些类但是他们的接口又有点不符合项目的要求,千万别重写这个类,试试适配器吧!