适配器模式是什么?
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器模式解决什么问题?
我国的电压为220V,但外国的电压大多为110V,导致我国的电器设备在国外开不了机,或者国外的电器设备在我国因电压太大导致报废,此时就需要适配器将电压进行转换。
适配器模式举例
现有Person和Robot接口及它们的实现类:
interface Person {
void Wear();
void Hair();
}
interface Robot {
void NoWear();
void NoHair();
}
class APerson implements Person {
@Override
public void Wear() {
System.out.println("穿着衣服");
}
@Override
public void Hair() {
System.out.println("有头发");
}
}
class ARobot implements Robot {
@Override
public void NoWear() {
System.out.println("穿着铁皮");
}
@Override
public void NoHair() {
System.out.println("没头发");
}
}
商场分别开放了给Robot和Person进入的通道
class Shop {
void ShopForPerson(Person person) {
person.Hair();
person.Wear();
}
void ShopForRobot(Robot robot){
robot.NoWear();
robot.NoHair();
}
}
调用过程:
Person p=new Person();
Robot r=new Robot();
Shop shop=new Shop();
shop.ShopForPerson(p);
shop.shopForRobot(r);
当Robot想要进入Person通道时,新建RobotDisguisedPerson继承Person,内部维护Robot实例,内部改为调用Robot方法:
class RobotDisguisedPerson implements Person {
Robot robot;
public RobotDisguisedPerson(Robot robot) {
this.robot = robot;
}
@Override
public void Wear() {
robot.NoWear();
}
@Override
public void Hair() {
robot.NoHair();
}
}
调用过程:此时Shop并不知道进去的其实是Robot
Robot r=new Robot();
Person rdp=new RobotDisguisedPerson(r);
Shop shop=new Shop();
shop.ShopForPerson(rdp);
适配器模式最好例子
最好的例子是反迭代器的实现,具体可看Java集合中级——LinkedListed源码解析中反迭代器的源码