适配器就是将一个类的接口,转换成客户期望的另一个接口,让原本接口不兼容的类可以合作无间
适配器中:定义一个包装类,不兼容接口对象,包装类就是适配器,包装的对象是适配者
配置器模式四个角色:
Target:目标抽象类
Adapter:适配器类
Adaptee:适配者类
Client:客户类
/*
* 定义一个接口定义后面要实现的方法
* */
public interface Robot {
//定义两个叫和移动方法
void cry();
void move();
}
/*
* 定义一个实体类Cat
* */
public class Cat {
public void miao() {
System.out.println("猫叫,喵喵……");
}
public void run() {
System.out.println("四只爪子跑");
}
}
/*
* 定义一个模仿机器人的类实现robot的方法
* */
public class BioRobot implements Robot {
@Override
public void cry() {
System.out.println("生成一个可以叫的机器人!");
}
@Override
public void move() {
System.out.println("生成一个可以动的机器人!");
}
}
/*
* 适配器类,机器人模仿猫
* */
public class CatAdapter implements Robot {
Cat cat;
public CatAdapter(Cat cat) {
//要适配的对象的引用
this.cat = cat;
}
/*
* 实现接口中的方法,只需要在相应的方法之间进行转换完成
* */
@Override
public void cry() {
System.out.println("机器人模仿猫叫");
cat.miao();
}
@Override
public void move() {
System.out.println("机器人模仿行走");
cat.run();
}
}
/*
* 客户端
* */
public class Client {
public static void main(String[] args) {
//需要一个机器人所以先new一个
BioRobot robot = new BioRobot();
//还需要一个要模仿的对象
Cat cat = new Cat();
//将模仿的实体包装到机器人中
Robot catRobot = new CatAdapter(cat);
//机器人的行为
System.out.println("机器人的这些行为:");
catRobot.cry();
catRobot.move();
}
}
优点:
- 将目标类和适配者类解耦,通过使用适配器让不兼容的接口变成兼容的,让客户从实现的接口解耦。
- 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
- 灵活性和拓展性,在不修改原有代码的基础上增加新的适配器类
使用场景:
- 系统需要使用现有的类,这些类的接口不符合系统的需要
- 想建立一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类