設計模式--擴充卡模式
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL00ERPNzYU9EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL5EzN4MjNxUTMzATMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
擴充卡模式基本介紹
基本介紹
- 擴充卡模式(Adapter Pattern)将某個類的接口轉換成客戶期望的另一個接口表示,主要目的是相容性,讓原本因接口不比對不能一起各種的兩個類可以協同各種,其别名為包裝器(Wrapper)
- 擴充卡屬于結構型模式
- 主要分為三類:類擴充卡模式、對象擴充卡模式、接口擴充卡模式
工作原理
- 擴充卡模式:将一個類的接口轉換成另一種接口,讓原本接口不相容的類可以相容
- 從使用者的角度看不到被适配者,是解耦的
- 使用者調用擴充卡轉換出來的目标接口方法,擴充卡在調用被适配者的相關接口方法
- 使用者收到回報結果,感覺隻是和目标接口互動
生活中擴充卡例子:
多功能插座
-==================================================
假設目前我們有220V電壓,手機不可以直接使用,手機直流電是5V
類擴充卡模式
建立被适配的類
//被适配的類
public class Voltage220V {
public int output220v(){
int src = 220;
System.out.println("輸出電壓"+src+"伏");
return src;
}
}
新增适配接口
//适配接口
public interface IVoltage5V {
public int output5V();
}
新增擴充卡
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
@Override
public int output5V() {
//擷取到220V的帶你優雅
int i = output220v();
int dstV = i / 44; //專程5V
return dstV;
}
}
新增手機類使用擴充卡
public class Phone {
//充電
public void charging(IVoltage5V iVoltage5V){
if (iVoltage5V.output5V() == 5){
System.out.println("電壓 5 V 可以充電");
}else{
System.out.println("不能充電");
}
}
}
測試
public class Client {
//使用
public static void main(String[] args) {
System.out.println("=== 類擴充卡 ===");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
對象擴充卡
//被适配的類
public class Voltage220V {
public int output220v(){
int src = 220;
System.out.println("輸出電壓"+src+"伏");
return src;
}
}
//适配接口
public interface IVoltage5V {
public int output5V();
}
public class VoltageAdapter implements IVoltage5V{
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int dst = 0;
if(voltage220V != null){
int src = voltage220V.output220v();//擷取220v 電壓
System.out.println("使用對象擴充卡~~~");
dst = src / 44;
System.out.println("輸出的電壓"+ dst);
}
return dst;
}
}
新增手機适配
public class Phone {
//充電
public void charging(IVoltage5V iVoltage5V){
if (iVoltage5V.output5V() == 5){
System.out.println("電壓 5 V 可以充電");
}else{
System.out.println("不能充電");
}
}
}
public class Client {
//使用
public static void main(String[] args) {
System.out.println("=== 對象擴充卡 ===");
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
接口擴充卡模式
- 一些書籍稱為:擴充卡模式 當不需要全部實作提供當接口方法時,可先設計一個抽象類實作接口,并為該接口中每個方法提供一個預設的實作(空方法),那麼該抽象類的子類可有選擇地覆寫父類的某些方法來實作需求
- 适用于一個接口不想使用其所有的方法的情況。
建立接口
public interface Interface4 {
public void m1();
public void m2();
public void m3();
public void m4();
}
抽象實作類
//在AbsAdapter 我們将Interface4的方法 空實作
public abstract class AbsAdapter implements Interface4{
public void m1(){
}
public void m2(){
}
public void m3(){
}
public void m4(){
}
}
選擇性實作
public class Client {
//使用
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
@Override
public void m1() {
System.out.println("使用了m1方法");
}
};
absAdapter.m1();
}
}
擴充卡模式在我們 SpringMVC 架構的 HandlerAdapter,就使用了擴充卡模式
個人部落格:
http://blog.yanxiaolong.cn/