适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
设计原则:
1、面向接口编程(面向抽象编程)
2、封装变化
3、多用组合,少用继承
4、对修改关闭,对扩展开放
示例:(没有适配器)
class Demo{
public static void main(String[] args) {
PowerA powerA = new PowerAImpl();
work(powerA);
PowerB powerB = new PowerBImpl();
work(powerB);//这条语句编译过不了,因为 work(PowerA)对于参数(PowerB)不适用,两类不兼容
}
public static void work(PowerA a) {
System.out.println("正在连接...");
a.insert();
System.out.println("工作结束.");
}
}
interface PowerA{
public void insert();
}
class PowerAImpl implements PowerA{
public void insert() {
System.out.println("电源A开始工作");
}
}
interface PowerB{
public void connet();
}
class PowerBImpl implements PowerB{
public void connet() {
System.out.println("电源B开始工作");
}
}
用了适配器之后:
class Demo{
public static void main(String[] args) {
PowerA powerA = new PowerAImpl();
//work(powerA);
PowerB powerB = new PowerBImpl();
//work(powerB);
Adapter adapter = new Adapter(powerB);
work(adapter);//A和 B能兼容
}
public static void work(PowerA a) {
System.out.println("正在连接...");
a.insert();
System.out.println("工作结束.");
}
}
//适配器
class Adapter implements PowerA{
private PowerB powerB;
public Adapter(PowerB powerB) {
this.powerB = powerB;
}
public void insert() {
powerB.connet();
}
}
interface PowerA{
public void insert();
}
class PowerAImpl implements PowerA{
public void insert() {
System.out.println("电源A开始工作");
}
}
interface PowerB{
public void connet();
}
class PowerBImpl implements PowerB{
public void connet() {
System.out.println("电源B开始工作");
}
}
输出结果:
正在连接...
电源B开始工作
工作结束.
另一种适配器:
//没有用适配器之前,Dog类要实现Animal接口中的所有方法,与想要的不符
interface Animal{
public void sing();
public void cry();
public void run();
public void swim();
}
class Dog implements Animal{
public void sing() {}
public void cry() {}
public void run() {
System.out.println("我是疯狗,疯狂的跑");
}
public void swim() {}
}
//适配器
abstract class AnimalFunction{
public void sing() {}
public void cry() {}
public void run() {}
public void swim() {}
}
class Dog extends AnimalFunction{
public void run() {
System.out.println("我是疯狗,疯狂的跑");
}
}