模式实例之——适配器实例

2019-07-14 02:50发布

场景:手机通过充电器后从220V常规电源到4V



描述:220v家庭用电不能直接对手机充电,需要把电压降到4v才可以。(不知道是不是4v,这里简化一下:到4v即可)



(一)常规电源
//Adaptee(被适配者)

public class NormalPower

{

public int GetPower()

{

return 220;

}

}



常规电源,电压为220v,这个就是将被适配的类。

(二)手机
//手机

public class Phone

{

public void AddPower(int iPower)

{

if (iPower == 4)

{

Console.WriteLine("手机充电中……");

}

else

Console.WriteLine("充电电压不正常,手机即将损坏!");

}

}



这就是客户端,用以使用4v电源。

(三)自己定义的接口
//定义新接口(自己定义)

public interface IPhoneAdapter

{

int GetPower4V();

}



这个用来实现转换电源电压

(四) 类适配器实现
//类适配

public class Adapter:NormalPower,IPhoneAdapter

{

public int GetPower4V()

{

//正常电压

int iPower = this.GetPower();

//变压

iPower-= 216;

//输出4V电源

return iPower;

}

}



类适配器以继承方式实现。在实现自定义接口时,得到父类的GetPower()的值为220V,通过变压得到4V。

(五)测试类适配器
[Test]

public void TestAdapter()

{

//常规电源

NormalPower power = new NormalPower();



//手机

Phone phone = new Phone();



//手机加上常规电源,当前状态

phone.AddPower(power.GetPower());



//电源充电适配器

Adapter adapterPower = new Adapter();



//硬盘加上电源,当前状态

phone.AddPower(adapterPower.GetPower4V());

}





结果:

充电电压不正常,手机即将损坏!

手机充电中……



(六)对象适配器实现
//对象适配器

public class Adapterr : IPhoneAdapter

{

private NormalPower _power = new NormalPower();



public int GetPower4V()

{

//正常电压

int iPower = _power.GetPower();



//变压

iPower -= 216;



//输出4V电源

return iPower;

}

}



对象适配器通过组合方式来实现。

(七) 对象适配器测试

[Test]
public void TestAdapter()

{

//常规电源

NormalPower power = new NormalPower();



//手机

Phone phone = new Phone();



//手机加上常规电源,当前状态

phone.AddPower(power.GetPower());



//电源充电适配器

Adapterr adapterPower = new Adapterr();



//硬盘加上电源,当前状态

phone.AddPower(adapterPower.GetPower4V());

}





结果:

充电电压不正常,手机即将损坏!

手机充电中……



在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。

那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式。

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。



GOF23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。

Adapter模式可以实现的非常灵活,不必拘泥于GOF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象“作为新的接口方法参数,来达到适配的目的。

Adapter模式本身要求我们尽可能地使用”面向接口的编程"风格,这样才能在后期很方便的适配。

http://www.cnblogs.com/jams742003/