java 适配器 设计模式
适配器模式:将一个类的接口换成客户希望的另外一个借口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
oo设计原则:
- 面向接口编程(面向抽象编程)
- 封装变化
- 多用组合,少用继承
- 对修改关闭,对扩展开放
在我们日常开发中,设计某项需求的时候没有考虑周全,在扩展新的需求的时候,原来的接口就不能用了,如果我们一定要用原来的接口,这时候就需要适配器了,就如上图中的C。
代码案例:
1.首先需要定义一个电源A接口
有一个连接的功能
package adapter;
public interface PowerA {
public void insert();
}
2.定义一个类来实现这个接口
package adapter;
public class PowerAImpl implements PowerA{
public void insert() {
System.out.println("电源开始工作");
}
}
3.定义一个测试类,其中有一个静态的方法,让电源A开始工作,必须传入一个PowerA类型的实现。
package adapter;
public class Test {
public static void main(String[] args) {
PowerA powerA = new PowerAImpl();
work(powerA);
}
public static void work(PowerA a) {
System.out.println("正在连接...");
a.insert();
System.out.println("工作完成");
}
}
4.此时我有拓展了一个PowerB接口的业务,想用测试类A的方法,使电源B工作。我不可能从新写一个方法,假如业务拓展的非常多咋办,代码都重复了,再说设计原则是对修改关闭的。
package adapter;
public interface PowerB {
public void insert();
}
class PowerBImpl implements PowerB{
public void insert() {
System.out.println("电源B开始工作");
}
}
5.我想在测试类中使用原有的方法,但是原有的方法只接受A类型的接口,这是我们需要一个适配器,如图的C,来使A兼容B。
通过适配器把B类型转换成A类型
package adapter;
/**
* 定义一个PowerA类型的适配器 类
* 定义一个 PowerB 的属性
* 传入一个 PowerB 类型的对象,来执行连接这个功能
*/
public class Adapter implements PowerA{
private PowerB powerB;
//构造方法
public Adapter(PowerB powerB) {
this.powerB = powerB;
}
public void insert(){
powerB.insert();
}
}
6.最后的测试类 如下:
package adapter;
public class Test {
public static void main(String[] args) {
PowerA powerA = new PowerAImpl();
work(powerA);
PowerB powerB = new PowerBImpl();
//work(powerB);
PowerA adapter = new Adapter(powerB);
work(adapter);
}
public static void work(PowerA a) {
System.out.println("正在连接...");
a.insert();
System.out.println("工作完成");
}
}
结果如下:
即完成兼容的问题
适配器还有另外的用法:
假如有一个动物接口,里面有 跑、吃、说话、游泳的方法
package adapter;
public interface Animal {
public void run();
public void eat();
public void sing();
public void swim();
}
当我想实现一个狗的类,我只住注重跑这个方法,其他的方法我不在意,但是,一个类想要实现一个接口,必须实现接口中的所有方法,你可以写空实现,,假如想要实现各种各样的动物,如果都要写的话,估计我们会哭晕在厕所。
这时 适配就可以起到意想不到的功能
定义一个抽象类,去实现动物这个接口,其中的方法都进行空实现。让狗类去继承这个抽象类,只重写跑这个方法就可以了。
package adapter;
public abstract class AnimalFunction implements Animal{
public void run() {}
public void eat() {}
public void sing() {}
public void swim() {}
}
最后用狗这个类去继承上面的那个抽象类,
狗类中只重写跑这个方法即可。
package adapter;
public class Dog extends AnimalFunction{
public void run() {
System.out.println("我是一条狼狗,捉羊轻而易举");
}
}