java设计模式之适配器模式
设配器模式定义:
- 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法工作的两个类能在一起工作
适配器模式的使用场景:
- 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
- 需要建立统一的输出接口,而输入端的类型不可预知
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大联系的类,包括一些可能在将来进入的类一起工作
适配器模式UML图:
- Target:目标角色,也就是期待的接口
- Adaptee: 现在需要适配的接口
- Adapter:适配器角色,将就旧接口转换成目标接口
适配器模式满足的前提:
- 适配器对象必须实现原有接口(原有接口的实现类)
- 适配器对象必须要有目标接口的引用;
- 对适配器原有接口方法的调用被委托给目标接口实例的特定方法
适配器具有的特点:
- 1.必须实现旧接口
- 2.适配器对象中持有对新接口的引用,当调用旧接口时,
- 将这个调用委托给实现新接口的对象来处理,也就是在适配器对象中组合一个新接口。
适配器模式的简单实例:
- 场景: 一家旅店(client)的插座是两孔插座,只能使用两孔插头(Target),现在客人的充电器是三孔插头(Adaptee),如何实现客户手机充电?
- 方法: 适配器(Adapter),也就是生活中转接头应运而生,他必须有三孔插头的插孔(实现Adaptee),又要有两孔的插头(有Target的引用),这样手机就不是直接充电,而是依靠转接头来实现充电这一行为.
适配器模式案例实现:
- Target:
public interface OldSocket {
void RoundCharge();
}
- Adaptee:
public interface NewSocket {
void CircleCharge();
}
- Client:
public class Hotel {
private OldSocket mOldSocket;
public Hotel() {
}
public void setAdapter(OldSocket oldSocket) {
mOldSocket = oldSocket;
}
//拥有自己的行为充电:
public void charge() {
mOldSocket.RoundCharge();
}
}
- Adapter:
public class SocketAdapter implements OldSocket {
private NewSocket mNewSocket;
public SocketAdapter(NewSocket newSocket) {
mNewSocket = newSocket;
}
@Override
public void RoundCharge() {
mNewSocket.CircleCharge();
}
}
- 调用充电:
NewSocket newSocket = new NewSocket() {
@Override
public void CircleCharge() {
Log.d("TAG", "圆形插口充电");
}
};
Hotel hotel = new Hotel();
SocketAdapter adapter = new SocketAdapter(newSocket);
hotel.setAdapter(adapter);
hotel.charge();