設(shè)計(jì)模式之適配器(adapter)模式 -- 適配老版本接口和第三方接口
場(chǎng)景介紹:
(1)假設(shè)我們做了一個(gè)第一版的一個(gè)系統(tǒng)病游,這個(gè)系統(tǒng)里有一個(gè)接口和一個(gè)實(shí)現(xiàn)類
(2)接著我們開始做第二版的系統(tǒng)岸浑,這個(gè)系統(tǒng)我們定義了一個(gè)新的接口,和新的實(shí)現(xiàn)類
(3)但是我們同時(shí)在第二版的系統(tǒng)中,也要使用第一版系統(tǒng)中定義的那個(gè)老接口和老實(shí)現(xiàn)類
1.不使用設(shè)計(jì)模式的實(shí)現(xiàn)方式如下:
package com.lucky.pattern.adapter;
/**
* @author: LIJY
* @Description: 不使用設(shè)計(jì)模式的實(shí)現(xiàn)
* @Date: 2021/10/1 17:58
*/
public class WithoutAdapterPatternDemo {
public static void main(String[] args) {
OldInterface oldInterface = new OldInterfaceImpl();
NewInterface newInterface = new NewInterfaceImpl();
oldInterface.oldExecute();
newInterface.newExecute();
}
/**
* 老版本的接口
*/
public static interface OldInterface {
void oldExecute();
}
/**
* 老版本的接口實(shí)現(xiàn)類
*/
public static class OldInterfaceImpl implements OldInterface {
public void oldExecute() {
System.out.println("老版本接口實(shí)現(xiàn)的功能邏輯");
}
}
/**
* 新版本的接口
*/
public static interface NewInterface {
void newExecute();
}
/**
* 新版本的接口實(shí)現(xiàn)類
*/
public static class NewInterfaceImpl implements NewInterface {
public void newExecute() {
System.out.println("新版本接口實(shí)現(xiàn)的功能邏輯");
}
}
}
不適用設(shè)計(jì)模式的缺點(diǎn)和問題:
在調(diào)用接口的代碼中寞肖,融合和新舊兩套接口似舵,這是一件很麻煩的事。
- 新舊接口面向的規(guī)范和風(fēng)格是完全不同的兩套接口時(shí)霍狰,理解和維護(hù)的成本就提高了抡草;
- 可能不給你在新的項(xiàng)目中使用老接口的機(jī)會(huì),強(qiáng)制要求按照新版本的接口走蔗坯,老接口的實(shí)現(xiàn)類就沒法使用了康震。
2.使用設(shè)計(jì)模式的實(shí)現(xiàn)方式如下:
package com.lucky.pattern.adapter;
/**
* @author: LIJY
* @Description: 使用適配器設(shè)計(jì)模式的實(shí)現(xiàn)
* @Date: 2021/10/1 22:11
*/
public class AdapterPatternDemo {
public static void main(String[] args) {
NewInterface oldObject = new NewInterfaceAdapter(new OldInterfaceImpl());
NewInterface newObject = new NewInterfaceImpl();
oldObject.newExecute();
newObject.newExecute();
}
/**
* 定義一個(gè)適配器類
*/
public static class NewInterfaceAdapter implements NewInterface {
private OldInterface oldObject;
public NewInterfaceAdapter(OldInterface oldObject) {
this.oldObject = oldObject;
}
public void newExecute() {
oldObject.oldExecute();
}
}
/**
* 老版本的接口
*/
public static interface OldInterface {
void oldExecute();
}
/**
* 老版本的接口實(shí)現(xiàn)類
*/
public static class OldInterfaceImpl implements OldInterface {
public void oldExecute() {
System.out.println("老版本接口實(shí)現(xiàn)的功能邏輯");
}
}
/**
* 新版本的接口
*/
public static interface NewInterface {
void newExecute();
}
/**
* 新版本的接口實(shí)現(xiàn)類
*/
public static class NewInterfaceImpl implements NewInterface {
public void newExecute() {
System.out.println("新版本接口實(shí)現(xiàn)的功能邏輯");
}
}
}
3. 適配器模式:
有新老兩個(gè)接口和新老接口的實(shí)現(xiàn)類,現(xiàn)在項(xiàng)目中要面向新接口開發(fā)宾濒,老接口的實(shí)現(xiàn)類就不能直接用了腿短,不能直接面向老接口開發(fā)。
解決方法:
開發(fā)一個(gè)老接口到新接口的適配器绘梦,適配器是實(shí)現(xiàn)了新接口的橘忱,但是適配器中持有老接口實(shí)現(xiàn)類實(shí)例的引用,適配器的新接口方法的實(shí)現(xiàn)谚咬,全部是基于老接口實(shí)現(xiàn)類的方法來實(shí)現(xiàn)即可鹦付。
對(duì)于調(diào)用法而言,只要使用適配器來開發(fā)即可择卦,就可以通過面向新接口開發(fā)敲长,底層使用老接口實(shí)現(xiàn)類。