05 设计模式之适配器模式
什么事适配器
1,适配器模式是一种结构型设计模式。适配器模式的思想是,把一个类的接口变化成客户所期待的另一种接口,从而使原因因接口不匹配而无法在一起工作的2个类能够在一起工作。
苹果手机是否可以插入 圆孔耳机,(圆孔)转接头(接入苹果口子)
- 适配器模式涉及3个角色
源(Adaptee):需要被适配的对象或者类型,相当于插头。
适配器(Adapter): 连接目标和源中间对象,相当于插头转换器。
目标(Target):期待得到的目标,相当于插座
适配器模式包括3种形式: 类适配器模式,对象适配器模式,接口适配器模式()
适配器模式应用场景:
1,springmvc多个不同的controller实现
2,API多版本控制
1,系统需要使用现有的类,而这些类的接口不符合系统的接口。
2,想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括可能在将来引进的类一起工作。
3,类所做的事情相同或者相似,但是有不同的接口实现的时候。
4,旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口形式访问,但是我们不希望手动更改原有类的时候。
5,使用第三方组件。组件定义接口和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
springmvc 适配器原理分析
方式一: @Controller/@RquestMapping
方式2: 实现HttpRequestHandler接口
方式三: 实现controller接口
适配器模式就是把一个类的接口替换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的2个类能够在一起工作
package com.taotao.adapter.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: wangjin
* @CreateTime: 2022-06-26 21:26
*/
@RestController
public class TaoTaoController {
@RequestMapping("/getTaotao")
public String getTaotao(){
return "taotao";
}
}
package com.taotao.adapter.controller;
import org.springframework.stereotype.Component;
import org.springframework.web.HttpRequestHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: wangjin
* @CreateTime: 2022-06-26 21:28
*/
@Component("/taoTaoHttpRequestHandler")
public class TaoTaoHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
PrintWriter writer = httpServletResponse.getWriter();
writer.print("mayiktHttpRequestHandler");
writer.close();
}
}
package com.taotao.adapter.controller;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
* @Author: wangjin
* @CreateTime: 2022-06-26 21:32
*/
@Component("/implController")
public class TaoTaoImplController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
PrintWriter writer = response.getWriter();
writer.print("TaoTaoImplController");
writer.close();
return null;
}
}
package com.taotao.adapter.controller;
import com.taotao.adapter.controller.impl.AnnotationController;
import com.taotao.adapter.controller.impl.ImplController;
import com.taotao.adapter.controller.impl.RequestHandlerController;
/**
* @author 余胜军
* @ClassName AdapterInvok
* @qq 644064779
* @addres www.mayikt.com
* 微信:yushengjun644
*/
public class AdapterInvok {
public static void invok(Controller controller) {
if (controller instanceof AnnotationController) {
AnnotationController annotationController = (AnnotationController) controller;
annotationController.handleRequest();
return;
}
if (controller instanceof ImplController) {
ImplController implController = (ImplController) controller;
implController.handleRequest();
}
if (controller instanceof RequestHandlerController) {
RequestHandlerController requestHandlerController = (RequestHandlerController) controller;
requestHandlerController.requestHandler();
}
}
public static void main(String[] args) {
AdapterInvok.invok(new ImplController());
}
}
适配器优缺点:
优点:
更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要,那么通过适配器模式可以让这些功能得到更好的复用。
更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然的扩展系统的功能。
缺点:
会导致系统紊乱:滥用适配器,会让系统变得非常凌乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。