-----谨以此文表明汪先生学过设计模式
1.适配器模式
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
类图:
三个角色:
Target目标角色:该角色定义把其他类转换为何种接口,也就是我们的期望接口,例子中的IUserInfo接口就是目标角色
Adaptee源角色:你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新、靓丽的角色、
Adapter适配器角色:适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:把源角色转换为目标角色,怎么转换?通过继承或是类关联的方式
2.举个例子
新建一个目标对象的接口,必须严格遵循依赖倒置原则和里氏转换原则
package com.wx.adapterpattern.base;
public interface Target {
public void request();
}
实现这个接口:
package com.wx.adapterpattern.imp;
import com.wx.adapterpattern.base.Target;
public class ConcreateTarget implements Target {
@Override
public void request() {
System.out.println("已经在好好服役的目标对象");
}
}
新建一个原角色的类,这是一个正在服役的类
package com.wx.adapterpattern.imp;
public class Adaptee {
public void specificRequest()
{
System.out.println("已经在好好服役的原始对象");
}
}
核心角色适配器角色,继承原始角色,实现目标对象接口
package com.wx.adapterpattern.imp;
import com.wx.adapterpattern.base.Target;
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.specificRequest();
}
}
测试:
package com.wx.adapterpattern.test;
import com.wx.adapterpattern.base.Target;
import com.wx.adapterpattern.imp.Adapter;
import com.wx.adapterpattern.imp.ConcreateTarget;
public class TestAdapterPattern {
public static void main(String[] agrs)
{
//原来的业务调用
ConcreateTarget concreateTarget=new ConcreateTarget();
concreateTarget.request();
//现在的业务调用
Target adapter = new Adapter();
adapter.request();
}
}
顺便了解一下贫血对象和充血对象:
贫血对象:一个对象如果不存储实体状态以及对象之间的关系.
充血对象:有实体状态和对象关系的模型就是充血领域模型
3.适配器模式的优点:
● 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成。
● 增加了类的透明性
● 提高了类的复
● 灵活性非常好
4.适配器模式的使用场景
你有动机修改一个已经投产中的接口时,适配器模式可能是最适合你的模式。它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题。
再次提醒一点,项目一定要遵守依赖倒置原则和里氏替换原则,否则即使在适合使用适配器的场合下,也会带来非常大的改造。因为适配器要去继承原始类,java只允许单一继承,如果再去继承目标类就不行,所以只能实现目标接口,
5.适配器模式的扩展
我们之前讲的通过继承进行的适配,叫做类适配器。对象适配器的通用类图,当不止一个原始类需要继承的时候怎么办?
java不可能进行多重继承的,所以就要用到对象适配器,就是在适配器中定义私有的引用指向需要继承的类。
对象适配器和类适配器的区别是:类适配器是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系,这是两者的根本区别。