1.定义
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
其实这个设计模式的名字,已经把他的功能说明的很清楚了,就是将不同接口的类,运用适配器,使得可以使用同一接口统一调用。
2.代码
2.1 类的适配器
public interface Runnable { void Run(); } public class Bird { public void Fly() { Console.WriteLine("飞翔在蓝天下"); } } public class BirdAdapter : Bird, Runnable { public void Run() { this.Fly(); } }
使用继承的方式,使BirdAdapter类在实现接口中可以调用基类的方法,从而实现了待适配接口和将旧的接口转换成新的接口的功能。
2.2 对象的适配器
public class BirdAdapter : Runnable { private Bird bird = new Bird(); public void Run() { bird.Fly(); } }
可以看到对象的适配器模式是使用关联关系,使BirdAdapter类中持有Bird类的对象,从而在实现接口中调用该对象的方法。这种方法比继承的方式更灵活。
3.特点
优点:使用适配器模式可以使不同的类在适配器的适配下可以进行统一调用(通过抽象类或接口)
缺点:添加了许多适配器类,类的结构变得更复杂
4.使用场景描述(假想)
在设计框架的时候,假设一个场景,初始化的时候需要加载许多功能类,但是每一个类的初始化方法可能并不一致,
为了实现灵活初始化,我们可以对每一个功能类都实现一个适配器类,这些适配器类都实现了同一个接口,将每个类的初始化方法在接口中进行实现,
我们就可以将所有需要初始化的类都放置到接口的集合中,遍历后统一调用接口的方法,实现初始化,当添加了新的初始化类后,只需要在list中添加新的适配器对象,
甚至我们可以将初始化类的名字放置到配置文件中,通过反射获取相应的适配器对象,从而实现动态初始化的功能。
当然上面的内容是我自己的假像,我并没有这样设计过框架,希望之后可以尝试。
祝各位学习愉快~
(UML图不想拷贝了,抽时间自己画好后补上)