设计模式:适配器模式
前言
适配器(Adapter)模式是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作。
UML
适配器模式是比较容易理解的设计模式,下面看UML图:
可以看到,适配器模式主要分为4个角色:
1.client:客户端,即实际使用目标接口方法的类
2.Target:目标接口,即提供给客户端调用的方法
3.Adaptee:原始角色,即现有的方法
4.Adapter:适配器,即将现有的方法适配到目标接口,使得客户端能够调用目标方法来完成功能。
例子
下面用比较普遍的充电器的例子来演示:
需求是到外国旅游,但是只带了中国的充电器,但是外国只有外国的充电接口,所以需要适配器来匹配外国的充电接口和中国的充电器。
演示:
1。首先是中国的充电器接口和实现类
public interface ICNSocket_Adatpee { //中国接口 void CNSocket(); } public class CNSocket implements ICNSocket_Adatpee{ @Override public void CNSocket() { System.out.println("use CNSocket"); } }
2.外国的充电接口及实现类
public interface IForeignSocket_Target { //外国标准接口 void foreignSocket(); } public class ForeginSocket implements IForeignSocket_Target{ @Override public void foreignSocket() { System.out.println("use foreignSocket"); } }
3.外国可充电的地方
public class Foreign_client{ //该地方里面需要用固定的充电器 private IForeignSocket_Target socket; public Foreign_client() {} //该地方的插座插入充电器 public void setSocket(IForeignSocket_Target socket) { this.socket =socket; } //充电功能 public void charge() { socket.foreignSocket(); } }
4.适配器
//这是将中国充电器适配到外国的接口的方法 public class SocketAdapter implements IForeignSocket_Target{ private ICNSocket_Adatpee cnSocket; //创建适配器的时候必须传入已有接口 public SocketAdapter(ICNSocket_Adatpee cnsocket) { this.cnSocket = cnsocket; } //将现有接口适配到新的接口 @Override public void foreignSocket() { cnSocket.CNSocket(); } }
现在4个角色都已经完成了。来测试一下例子需求吧。
//这是测试类 public class Main { public static void main(String[] args) { //去外国旅游,只带了中国的接口 ICNSocket_Adatpee cnsocket = new CNSocket(); //在外国找了一个地方充电 Foreign_client f = new Foreign_client(); //由于无法充电,所以拿出适配器来插入中国的接口 SocketAdapter socketAdapter = new SocketAdapter(cnsocket); //然后插入外国地方的插座 f.setSocket(socketAdapter); //充电 f.charge(); } }
这是比较简单的例子。但是应该也比较容易理解适配器模式的基本意思。
GitHub源码:适配器模式例子