目录
1.适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
双向适配器模式:在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法。
2.分类
①类适配器模式
通过多重继承目标接口和被适配者类方式来实现适配(希望将一个类转换成满足另一个新接口的类)。
②对象适配器模式
使用组合来实现适配(希望将一个对象转换成满足另一个新接口的对象)。
③接口适配器模式
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。
注意:根据合成复用原则,组合大于继承。因此,类的适配器模式应该少用。
3.主要角色
①目标抽象类
当前系统业务所期待的接口,可以是抽象类或接口。
②适配者类
被访问和适配的现存组件库中的组件接口,适配者(被适配的角色)一般是一个具体类。
③适配器类
一个转换器,通过继承或引用适配者的对象,把适配器接口转换成目标接口。
4.例题
使用Java语言实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫(Cry()),狗可以学猫抓老鼠(catchMouse())。要求绘制相应的类图并写出适配器(Adapter)类的代码。
①类图
②代码
//1)创建目标抽象类Cat
package com.rw.adapter;
public interface Cat {
public void meow();
public void catchMouse();
}
//2)创建适配者类ConcreteCat ,为正常的小猫
package com.rw.adapter;
public class ConcreteCat implements Cat {
public void meow() {
System.out.println("喵喵喵~");
}
public void catchMouse() {
System.out.println("抓老鼠");
}
}
//3)创建目标抽象类Dog
package com.rw.adapter;
public interface Dog {
public void cry();
public void holdBone();
}
//4)创建适配者类ConcreteDog ,为正常的小狗
package com.rw.adapter;
public class ConcreteDog implements Dog{
public void cry() {
System.out.println("汪汪汪~");
}
public void holdBone() {
System.out.println("叼骨头");
}
}
//5)创建适配器类Adapter ,在猫的动作中调用狗的动作,在狗的动作中调用猫的动作
package com.rw.adapter;
public class Adapter implements Cat,Dog {
private Cat cat;
private Dog dog;
public void setCat(Cat cat) {
this.cat=cat;
}
public void setDog(Dog dog) {
this.dog=dog;
}
public void meow() {
dog.cry();
}
public void catchMouse() {
dog.holdBone();
}
public void cry() {
cat.meow();
}
public void holdBone() {
cat.catchMouse();
}
}
//6)创建测试类Client
package com.rw.adapter;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
Cat cat0=new ConcreteCat();
Dog dog0=new ConcreteDog();
Adapter adp=new Adapter();
Cat cat=new ConcreteCat();
Dog dog=new ConcreteDog();
adp.setCat(cat);
adp.setDog(dog);
System.out.println("正常的猫:");
cat0.meow();
cat0.catchMouse();
System.out.println("正常的狗:");
dog0.cry();
dog0.holdBone();
System.out.println("");
while(true)
{
System.out.println("请输入您想要的选择:");
System.out.println("1:猫学狗叫 2:猫学狗叼骨头");
System.out.println("3:狗学猫叫 4:狗学猫抓老鼠");
int i=scanner.nextInt();
if(i==1){
adp.meow();}
else if(i==2){
adp.catchMouse();}
else if(i==3){
adp.cry();}
else if(i==4){
adp.holdBone();}
else {
System.out.println("输入有误, 请按照提示再次输入!");}
}
}
}