适配器模式
适配器模式
适配器模式是指一个类的接口要转换成客户期望的另一个接口,但原本的接口不兼容的类可以一起工作。属于结构型设计模式。
适用场景
- 已存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况
- 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护you"yu不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
优点
- 能提高类的透明性和复用,现有的类复用不需要改变
- 目标类和适配器类解耦,提高程序的扩展性
- 在很多场景中符合开闭原则
缺点
- 适配器编写过程中需要全面考虑,可能会增加系统的复杂性
- 增加代码阅读难度,降低代码可读性,过度使用适配器会使系统代码变得凌乱
案例1
AC220.class
public class AC220 { public int outputAC220V() {
int output = 220;
System.out.println("输出电流: " + output + "V");
return output;
}
}
DC5.class
public interface DC5 {
}
PowerAdapter.class
public class PowerAdapter implements DC5 { private AC220 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
int adapterOutput = adapterInput / 44;
System.out.println("使用PowerAdapter输入AC:" + adapterInput + "V,输出DC:" + adapterOutput + "V");
return adapterOutput;
}
}
案例2
LoginAdapter.class
/** * 在适配器里面,这个接口是可有可无,不要跟模板模式混淆
* 模板模式一定是抽象类,而这里仅仅只是一个接口
*/
public interface LoginAdapter {
boolean support(Object adapter);
ResultMsg login(String id, Object adapter);
}
LoginForQQAdapter.class
public class LoginForQQAdapter implements LoginAdapter {
public boolean support(Object adapter) {
return adapter instanceof LoginForQQAdapter;
}
public ResultMsg login(String id, Object adapter) {
return null;
}
}
RegistAdapter.class
public interface RegistAdapter {
boolean support(Object adapter);
ResultMsg login(String id, Object adapter);
}
RegistForQQAdapter.class
public class RegistForQQAdapter implements RegistAdapter, LoginAdapter { public boolean support(Object adapter) {
return false;
}
public ResultMsg login(String id, Object adapter) {
return null;
}
}
IPassportForThird.class
public interface IPassportForThird { /**
* QQ登录
* @param id
* @return
*/
ResultMsg loginForQQ(String id);
}
PassportForThirdAdapter.class
/** * 结合策略模式、工厂模式、适配器模式
*/
public class PassportForThirdAdapter extends SiginService implements IPassportForThird {
public ResultMsg loginForQQ(String id) {
// return processLogin(id,RegistForQQAdapter.class);
return processLogin(id, LoginForQQAdapter.class);
}
private ResultMsg processLogin(String key,Class<? extends LoginAdapter> clazz){
try{
//适配器不一定要实现接口
LoginAdapter adapter = clazz.newInstance();
//判断传过来的适配器是否能处理指定的逻辑
if(adapter.support(adapter)){
return adapter.login(key,adapter);
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
PassportTest.class
public class PassportTest { public static void main(String[] args) {
IPassportForThird passportForThird = new PassportForThirdAdapter();
passportForThird.loginForQQ("");
}
}
以上是 适配器模式 的全部内容, 来源链接: utcz.com/z/517421.html