适配器模式

编程

适配器模式

适配器模式是指一个类的接口要转换成客户期望的另一个接口,但原本的接口不兼容的类可以一起工作。属于结构型设计模式。

适用场景

  1. 已存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况
  2. 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护you"yu不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案

优点

  1. 能提高类的透明性和复用,现有的类复用不需要改变
  2. 目标类和适配器类解耦,提高程序的扩展性
  3. 在很多场景中符合开闭原则

缺点

  1. 适配器编写过程中需要全面考虑,可能会增加系统的复杂性
  2. 增加代码阅读难度,降低代码可读性,过度使用适配器会使系统代码变得凌乱

案例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

回到顶部