日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式 之 适配器模式

發(fā)布時(shí)間:2025/6/15 asp.net 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 之 适配器模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目的

將一個(gè)類的接口轉(zhuǎn)換為另一個(gè)符合客戶期望的接口

達(dá)到的目的:

種類

有兩種:

  • 對象適配器
  • [ ] 類適配器(嗷~~暫時(shí)沒有實(shí)際場景讓自己完全明白嗷?)
  • NOTE: 對象適配器和類適配器使用兩種不同的適配方法(分別是組合委托和繼承)

舉個(gè)例子

我這里就拿使用三腳插頭充電的蘋果手機(jī)(港版充電器)來舉個(gè)例子吧~和圖中例子相反

interface IPhoneCharger {chargeWith3Footer(): void; }// Target interface PrimaryCharger {chargeWith2Footer(): void; }// adaptee // 蘋果手機(jī)實(shí)現(xiàn)蘋果手機(jī)充電器接口 class IPhone implements IPhoneCharger {chargeWith3Footer() {console.log("蘋果手機(jī)開始充電啦~~~?")} }// adapter // 普通充電器適配器 - 實(shí)現(xiàn)普通充電器接口 - 使蘋果手機(jī)等其他充電器可以適配普通2腳充電器進(jìn)行充電 class PrimaryChargerAdapter implements PrimaryCharger {private phone: any;constructor(phone: any) {this.phone = phone;}chargeWith2Footer(): void {if (this.phone.constructor === IPhone) {// 適配器在這里適配三腳和二腳充電器接口this.phone.chargeWith3Footer();}} }function TestDemo() {const iPhone = new IPhone();// iPhone.chargeWith2Foot(); // will fail// 中國大陸一般都是2插口插座~需要使用2腳充電器充電 chargeWith2Footer(),// 但是蘋果手機(jī)是三腳充電器不支持~~// 通過充電器適配器,實(shí)現(xiàn)了chargeWith2Footer(),符合客戶期望的接口~~~const adaptedIPhone = new PrimaryChargerAdapter(iPhone);adaptedIPhone.chargeWith2Footer(); // 完美~~ }TestDemo();
  • 在線測試

對號入座

Java中的適配器

客戶使用適配器的過程解析:

  • 客戶通過目標(biāo)接口調(diào)用適配器的方法對適配器發(fā)起請求
  • 適配器使用被適配者接口把請求換成被適配者的一個(gè)或多個(gè)調(diào)用接口
  • 客戶收到調(diào)用的結(jié)果,但未察覺一切是適配器的轉(zhuǎn)換作用。
  • // 改造成ts形式~~ class OldClassAdapter implements NewInterface {private OldClass ref;constructor(OldClass oc) {this.ref = oc;}public NewMethod(): void {this.ref.OldMethod();} }
    • 或許結(jié)合這一段代碼就可以更加理解適配器模式使用的場景

    思考 ?

    • 我所認(rèn)為的適配器模式應(yīng)該盡量不去修改被適配者。
    • 真正想做的是應(yīng)該是接口的轉(zhuǎn)換。

    優(yōu)點(diǎn)

    對象適配器模式優(yōu)點(diǎn):
    (1) 一個(gè)對象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標(biāo);
    (2) 將目標(biāo)類和被適配者類解耦,通過引入一個(gè)適配器類來重用現(xiàn)有的被適配者類,無須修改原有結(jié)構(gòu)。

    缺點(diǎn)

    過多的使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握。比如,明明看到調(diào)用的是 A 接口,其實(shí)內(nèi)部被適配成了 B 接口的實(shí)現(xiàn).

    適配器模式 VS 外觀模式

    先看下面這段熟悉的代碼~~ 摘自 @遠(yuǎn)峰

    // 統(tǒng)一的接口適配不同類 // Target 客戶期望使用的接口 interface ComputerInterface {usb(): void; }// Adaptee class HuaweiPhone {huaweiInterface(): void {console.log('華為手機(jī)的數(shù)據(jù)接口');} }// Adaptee class Iphone {iphoneInterface(): void {console.log('蘋果手機(jī)的數(shù)據(jù)接口');} }// Class Adapter class HuaweiDataWireAdapter extends HuaweiPhone implements ComputerInterface {usb(): void {console.log('使用華為數(shù)據(jù)線連接');super.huaweiInterface();} }class IphoneDataWireAdapter extends Iphone implements ComputerInterface {usb(): void {console.log('使用蘋果數(shù)據(jù)線連接');super.iphoneInterface();} }function commonAdapterDemo() {const computer1 = new HuaweiDataWireAdapter();computer1.usb();const computer2 = new IphoneDataWireAdapter();computer2.usb();} commonAdapterDemo();
    • 有些誤解就是一個(gè)適配器只用來適配一個(gè)類,但其實(shí)適配器模式也可以包裝多個(gè)類。
    • 這個(gè)例子就是一個(gè)類適配器的應(yīng)用。客戶期望使用他們自己的數(shù)據(jù)線連接 ~.usb(),然后通過適配器做了一個(gè)轉(zhuǎn)換,事實(shí)上沒有說將華為手機(jī)和蘋果手機(jī)的數(shù)據(jù)線接口給重新設(shè)計(jì)了~
    • [ ] 相類似的是外觀模式,還沒思考(? 狗帶了)

    NOTE: 外觀和適配器模式都可以包裝許多類,但是外觀模式是為了簡化操作,而適配器模式是將接口轉(zhuǎn)換為不同接口

    Q & A

    • 一個(gè)適配器需要做多少“適配”工作?
      適配器做的工作和目標(biāo)接口的大小成正比

    參考資料

    • Head First 設(shè)計(jì)模式
    • 原文鏈接

    總結(jié)

    以上是生活随笔為你收集整理的设计模式 之 适配器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。