概念
将一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。
自总结:
适配器模式如同在做补救一样,通过后天的补救让原有的事物发挥新的作用。补救的这个过程其实也避免的大规模的变更,非大规模的变更相风险稍稍会有所降低,而且可以达到复用了一个效果,在原来的事务上稍作装饰就是一个新的事物要比每次有了新的需求都重新写一个新的事物出来要节省不少的开销。
概念举例
我们原来有A、B两个图片,我们需要将AB图片进行整合,会发现因为他们的接口是不一致的,没有办法将AB进行整合,但是如果我们引入C则可以完美的解决这个问题,那么C就是一个适配器,通过C让AB这两个原本接口不相同的类可以一起工作(原理就显示我们的插头转换器一样,总的概括来讲就是借助第三方来达到二者的共处)
什么时候使用适配器模式
当系统的数据和行为都正确,但是接口不符时,既可以考虑使用适配器啦
两个类所作的事情相同或相似,但是具有不同的接口时要使用它,那么此时也有新的情况比如在除接口外各个部分都是规范的情况下,我们应该首先考虑是否进行重构,而不是首先开始使用适配器
概括一下:接口不符考虑使用适配器,如果双方都不容易修改才开始使用适配器。
优点
-
增加了类的透明度
-
提高类的复用度
- 源角色在原来的环境中还是源角色,但是当它和适配器联系在一起的时候它可能充当的新的角色,那么我们这个新的角色换人了吗?本质上还是原来的人,只不过去了别的剧组,当它脱离这个剧组的时候它还是本来的它。
-
灵活性好
- 当我们不再需要这个适配器的时候直接删除就好了,举个例子,我们的插头转换器,当我们不再需要插头转换器的时候直接拔下来就可以了,需要的时候再将它插上去就可以,是很方便的。
结构图
- Target
目标角色
定义了我们希望的接口,也就是客户的需求。 - Adapter
适配器角色
顾名思义肯定是核心角色,适配器角色将源角色转换为目标角色 - Adaptee
源角色
源角色就是需要我们进行适配的角色,也就是已经存在且运行良好的类
实施
- Target
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求");
}
}
- Adapter
class Adapter:Target
{
private Adaptee adaptee = new Adaptee();
public override void Request()
{
adaptee.SpecificRequest();
}
}
- Adaptee
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求");
}
}
- 客户端
class Program
{
static void Main(string[] args)
{
Target target = new Adapter();
target.Request();
Console.Read();
}
}