如果一个对象实现的接口不满足某个方法的参数要求,又想要这个方法调用这个对象的时候,使用中间对象适配器来解决这个矛盾。
客户类Clinet#MyRequest方法需要传入一个实现了Target接口的对象,并调用Target#request方法。但此时只有实现了 specialTarget了接口的Adaptee对象,在不改变源码的情况下使用适配器Adaptor来调和矛盾。首先从语法角度Adaptor一定要实现Target接口,这样才能传入MyRequest方法,而且Adaptor还要能够调用Adaptee的specialRequest去满足request调用的需求,我更喜欢把这种模式成为欺骗消费者模式。
欺骗消费者的方式有两种,一种是继承Adaptee这种被称为类适配器,一种是把Adaptee当做内部的属性被称为对象适配器。
public class Adaptee implements specialTarget{
@Override
public void specialRequest() {
System.out.println("我是Adaptee 我只实现了specialTarget#specialRequest 爱用不用");
}
}
public class Client { public void MyRequest(Target target){ System.out.println("我是客户 我现在要一个实现了target的对象"); target.request(); } public static void main(String[] args) { Client client = new Client(); Adaptee adaptee = new Adaptee(); //client.MyRequest(adaptee); Adaptor adaptor = new Adaptor(); client.MyRequest(adaptor); } }
public class Adaptor extends Adaptee implements Target{ @Override public void request() { System.out.println("我是Adaptor 你们的矛盾我来解决"); super.specialRequest(); } }