适配器模式主要是为了让不符合当前接口标准的对象 变得符合这一标准
看上去比较难懂 那就直接举例子上代码
如下一个场景
定义一个人 这个人能做什么事
public interface Human {
void doSomething();
}
定义一个具体的行为 说话
public class Action1 implements Human{
@Override
public void doSomething() {
System.out.println("说话");
}
}
定义第二个行为 敲代码
public class Action2 implements Human {
@Override
public void doSomething() {
System.out.println("敲代码");
}
}
定义一个dosomeThing类 参数为Human类型的对象
public class DoSomeThing {
public void doSomeThing(Human human){
human.doSomething();
}
}
建立一个测试类,通过传入不同的human类型的实现类对象 就可以执行对应的实现类方法
这种思想就是策略模式的思想
public class testMain {
public static void main(String[] args) {
DoSomeThing doSomeThing=new DoSomeThing();
doSomeThing.doSomeThing(new Action1());
doSomeThing.doSomeThing(new Action2());
}
}
此时又来了一个类dog
public class Dog {
public void wangwang(){
System.out.println("狗叫");
}
}
但是我们并不能把Dog类的对象直接传入doSomeThing方法,简单的说就是Dog类不属于Human类型传不进去
不符合里氏替换原则 如下面代码
public class testMain {
public static void main(String[] args) {
DoSomeThing doSomeThing=new DoSomeThing();
doSomeThing.doSomeThing(new Action1());
doSomeThing.doSomeThing(new Action2());
doSomeThing.doSomeThing(new Dog()); //这行代码编译不通过
}
}
那么有什么方法可以让doSomeThing能够接受Dog呢?
首先我们造一个Human类型的类 DogAdaptor
public class DogAdaptor implements Human {
private Dog dog=new Dog();
@Override
public void doSomething() {
dog.wangwang();
}
}
然后
public class testMain {
public static void main(String[] args) {
DoSomeThing doSomeThing=new DoSomeThing();
doSomeThing.doSomeThing(new Action1());
doSomeThing.doSomeThing(new Action2());
doSomeThing.doSomeThing(new DogAdaptor()); //这行代码编译通过
}
}
结果打印:
说话
敲代码
狗叫
这使得狗间接的变成人了 【滑稽】