《Head First 設(shè)計(jì)模式》《設(shè)計(jì)模式之禪(第二版)》 學(xué)習(xí)筆記寄月,碼云同步更新中
如有錯(cuò)誤或不足之處,請一定指出达吞,謝謝~
目錄
設(shè)計(jì)原則
- “依賴倒置”原則
- 未完待續(xù)...
設(shè)計(jì)模式
- 設(shè)計(jì)模式——策略模式
- 設(shè)計(jì)模式——裝飾者模式
- 設(shè)計(jì)模式——觀察者模式
- 設(shè)計(jì)模式——簡單工廠
- 設(shè)計(jì)模式——工廠方法模式
- 設(shè)計(jì)模式——抽象工廠模式
- 設(shè)計(jì)模式——單例模式
- 設(shè)計(jì)模式——命令模式
- 設(shè)計(jì)模式——適配器模式
- 未完待續(xù)...
適配器模式(Adapter Pattern)
定義
- 將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口游昼,從而使原本因接口不匹配而無法在一起工作的兩個(gè)類能夠在一起工作
優(yōu)點(diǎn)
- 可以讓兩個(gè)沒有任何關(guān)系的類一起運(yùn)行,讓目標(biāo)類和適配類實(shí)現(xiàn)解耦
- 增加了類的透明性
- 提高了類的復(fù)用度
- 具有非常好的靈活性
使用場景
- 系統(tǒng)需要使用已經(jīng)投入使用的類,但這些類不符合需求
案例
原本系統(tǒng)中有本公司員工信息的IUserInfo接口和UserInfo實(shí)現(xiàn)類硬萍。
但有一天從外部借調(diào)了一批員工過來聂儒,他們的用戶信息結(jié)構(gòu)OuterUserInfo和我們并不一樣虎锚。
現(xiàn)在需要列一張全部員工名單,這就需要用到適配器模式了薄货。
代碼
/**
* 我司員工信息接口
*/
public interface IUserInfo {
/**
* 獲取姓名
* @return
*/
public String getUserName();
/**
* 獲取手機(jī)號碼
* @return
*/
public String getMobilePhoneNumber();
/**
* 獲取家庭住址
* @return
*/
public String getAddress();
/**
* 獲取職位
* @return
*/
public String getPosition();
}
/**
* 我司員工信息實(shí)現(xiàn)類
*/
public class UserInfo implements IUserInfo{
@Override
public String getUserName() {
return "李四";
}
@Override
public String getMobilePhoneNumber() {
return "手機(jī)號碼:188xxxxxxxx";
}
@Override
public String getAddress() {
return "家庭住址:xx市xx區(qū)xxxxx";
}
@Override
public String getPosition() {
return "職位:CEO";
}
}
/**
* 外部員工接口
*/
public class OuterUser {
public Map<String, String> getBaseInfo() {
HashMap<String, String> baseInfo = new HashMap<>();
baseInfo.put("name", "張三");
baseInfo.put("phone", "188xxxxxxxx");
baseInfo.put("address", "xx市xx區(qū)");
return baseInfo;
}
public Map<String, String> getOfficeInfo() {
HashMap<String, String> officeInfo = new HashMap<>();
officeInfo.put("position", "CEO");
return officeInfo;
}
}
/**
* 適配器類
*/
public class OuterUserInfo implements IUserInfo {
private OuterUser outerUser;
public OuterUserInfo(OuterUser outerUser) {
this.outerUser = outerUser;
}
@Override
public String getUserName() {
return outerUser.getBaseInfo().get("name");
}
@Override
public String getMobilePhoneNumber() {
return outerUser.getBaseInfo().get("phone");
}
@Override
public String getAddress() {
return outerUser.getBaseInfo().get("address");
}
@Override
public String getPosition() {
return outerUser.getBaseInfo().get("position");
}
}
/**
* 測試類
*/
public class Test {
public static void main(String[] args) {
ArrayList<IUserInfo> userList = new ArrayList<>();
OuterUserInfo outerUserInfo = new OuterUserInfo(new OuterUser());
UserInfo userInfo = new UserInfo();
userList.add(outerUserInfo);
userList.add(userInfo);
for (IUserInfo iUserInfo : userList) {
System.out.println(iUserInfo.getUserName());
}
}
}
結(jié)果:
張三
李四
結(jié)語
適配器模式其實(shí)很簡單翁都,但能夠順利實(shí)施依賴于整個(gè)項(xiàng)目一直很好地遵循著“依賴倒置原則”和“里氏替換原則”。