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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

适配器模式coding

發布時間:2024/4/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 适配器模式coding 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在我們來學習適配器模式,現在我們建一個包,在結構型這個包下,建一個adapter,我們適配器模式呢,主要是分為,類適配器模式,還有對象適配器模式,那這兩個適配器模式,最重要的區別,就是一個通過組合,一個通過繼承,那我們都來演示一下,首先創建一個包,classadapter,類適配器模式,那這里說一下這個角色,第一個是被適配者

這個類圖還是很清晰的,首先Adapter它繼承了Adaptee被適配者,同時實現了目標接口,那這樣其實Target其實是兩種實現的,一種是具體的Target實現類,另外一種通過Adapter,他的實現類就變成了Adaptee的adapteeRequest

package com.learn.design.pattern.structural.adapter.classadapter;/*** * @author Leon.Sun**/ public class Adaptee {/*** 這里面有一個方法* 這個方法是被適配者獨有的* 我們起名就叫adapteeRequest* 被適配者的方法* 那下面第二個角色登場* 我們目標要實現成什么樣的呢* * */public void adapteeRequest(){System.out.println("被適配者的方法");}} package com.learn.design.pattern.structural.adapter.classadapter;/*** 對于Target它是一個接口* 他可以有很多實現類* 現在寫一個Target的實現類* 具體的Target* * * @author Leon.Sun**/ public interface Target {/*** 定義成接口* 看到這兩個方法是不一樣的* Target里面是request* Adaptee里面是adapteeRequest* */void request(); } package com.learn.design.pattern.structural.adapter.classadapter;/*** 他實現Target* * * @author Leon.Sun**/ public class ConcreteTarget implements Target {/*** concreteTarget目標方法* 那具體的Target也有了* 現在我們就要通過Adaptee適配者適配這個被適配者* 來達到Target這個目標* 我們創建Adapter* * */@Overridepublic void request() {System.out.println("concreteTarget目標方法");}} package com.learn.design.pattern.structural.adapter.classadapter;/*** 由他繼承被適配者Adaptee* 然后實現Target接口* 那我們看一下* Adaptee他來實現Target他的接口* 并且它是Adaptee的子類* 那很簡單* 我們這里只需要調用父類的adapteeRequest即可* 這樣我們就通過Adapter把適配者adapteeRequest這個方法呢適配給了Target* 因為Adapter是Adaptee的子類* 通過調用父類的adapteeRequest方法* 來實現了Target* 那我們看一下* 類圖* * 這里面強調的是繼承* 通過繼承來獲取被適配者的一些方法* 我們在實現Target的request方法中* 我們可以增加各種邏輯代碼* 這個還是比較好理解的* 那我們現在就換一種模式* 使用對象適配器模式* * * @author Leon.Sun**/ public class Adapter extends Adaptee implements Target{@Overridepublic void request() {//...super.adapteeRequest();//...} } package com.learn.design.pattern.structural.adapter.classadapter;/*** * @author Leon.Sun**/ public class Test {public static void main(String[] args) {/*** 我們先寫一個具體的Target實現類* new一個ConcreteTarget這個類* 這個類在這里就是為了襯托Adapter* 沒有他也是OK的* 但是ConcreteTarget它是Target的直接實現者* 現在我們就通過Adapter就把這個實現交給Adaptee* * */Target target = new ConcreteTarget();/*** 然后調用target的request方法* 這就是一個Target的實現* * 上面是具體的目標的方法* 也就是Target的具體實現* * */target.request();/*** 命名一個adapterTarget* 實現就通過Adapter來實現了* 因為Adapter實現了Adaptee接口* 這個時候調用它的request方法* 通過Adapter已經提交給了Adaptee* 那這個是類適配器模式* * * * */Target adapterTarget = new Adapter();adapterTarget.request();} }

client的Test就不看了,主要是看這四個類,注意這里是一個組合,第一個Adapter里面有一個Adaptee,他們兩都作為Target的實現類,那在對比一下剛剛的UML,Target還是有兩個實現類,只不過Adapter和Adaptee之間,并不是通過組合關系,而是通過繼承關系,那這個就是類適配器模式,和對象適配器模式最終要的區別,那這兩個例子講完了,現在我們再引入一個生活場景,那我們現在引入一個生活場景,例如我們手機充電,那在中國民用電都是220V的交流電,那我們手機基本上都是鋰電池,然后需要5V的直流電,那我們買手機的時候呢,會帶電源適配器,他的作用是把220V的交流電呢轉化成5V的直流電,那如果不轉換呢,手機也就壞了,那那我們現在就使用對象適配器模式,來解決這一個生活場景,那為什么使用對象適配器模式呢,那在繼承和組合的時候呢,我們優先選擇組合,這個是前面講原則的時候有講過的一個原則,當然呢如果沒得選,只能通過繼承,那也沒有辦法,那我們被適配者肯定是220V,AC代表交流電 package com.learn.design.pattern.structural.adapter.objectadapter;/*** 首先還是Target這個接口* 這個接口不變* * * @author Leon.Sun**/ public interface Target {void request(); } package com.learn.design.pattern.structural.adapter.objectadapter;/*** 也就是說換模式的時候* 從類適配器模式* 到對象適配器模式* 被適配者和Target* 是沒有變化的* 那具體的原有的Target* 實現類也沒有變* * * @author Leon.Sun**/ public class Adaptee {public void adapteeRequest(){System.out.println("被適配者的方法");}} package com.learn.design.pattern.structural.adapter.objectadapter;/*** * @author Leon.Sun**/ public class ConcreteTarget implements Target {@Overridepublic void request() {System.out.println("concreteTarget目標方法");}} package com.learn.design.pattern.structural.adapter.objectadapter;/*** 變化的出現在Adapter上* 我們創建一個Adapter* 這里讓他直接來實現Target* 然后實現這個方法* 因為沒有繼承* 所以不能調用父類的方法* 所以我把Adaptee組合到Adapter這個類里面* 然后調用它的adapteeRequest* * 通過組合的方式* 把具體實現Target的方法* 委托給adaptee來實現* 同樣的我們這里可以加代碼* 我們在看一下這個類圖* * * @author Leon.Sun**/ public class Adapter implements Target{private Adaptee adaptee = new Adaptee();@Overridepublic void request() {//...adaptee.adapteeRequest();//...} } package com.learn.design.pattern.structural.adapter.objectadapter;/*** 我們在copy代碼做版本演進的時候* 一定要注意import里面的包名* 你們可以直接在源代碼上改* 我這里是為了演示演進的過程* 以及給適配器模式這兩種方式* 方便你們學習* Test的代碼是沒有任何變化的* 變化的只有一個Adapter* * * @author Leon.Sun**/ public class Test {public static void main(String[] args) {Target target = new ConcreteTarget();target.request();Target adapterTarget = new Adapter();adapterTarget.request();} } package com.learn.design.pattern.structural.adapter;/*** * @author Leon.Sun**/ public class AC220 {/*** 返回值是int* 輸出220V的交流電* * * @return*/public int outputAC220V(){int output = 220;System.out.println("輸出交流電"+output+"V");return output;} } package com.learn.design.pattern.structural.adapter;/*** 他的方法就是輸出5V的直流電* 那這個就是Target* 那現在我們寫一個適配者* PowerAdapter* 電源適配器* * * @author Leon.Sun**/ public interface DC5 {int outputDC5V(); } package com.learn.design.pattern.structural.adapter;/*** 由他來實現5V的直流電* 首先在這個適配器的輸入呢* 現在就通過電源適配器里面還有一個變壓器* 實現了220V的交流電轉化成5V的直流電* 那我們測試一下* * * @author Leon.Sun**/ public class PowerAdapter implements DC5{/*** 把220V的交流電組合進來* * */private AC220 ac220 = new AC220();/*** 實現這個方法* * */@Overridepublic int outputDC5V() {/*** 賦值220V的交流電* 輸出200V交流電賦值給adapterInput* * */int adapterInput = ac220.outputAC220V();//變壓器.../*** 輸出等于什么呢* 等于輸入進來的220V的交流電除以44* 具體交流電和直流電怎么變化的呢* 我們就認為這里是一個變壓器* 也就是說我們適配層的邏輯可以寫在這里了* 這里就比較簡單的* 只把數字除以44* 變成5* * */int adapterOutput = adapterInput/44;/*** 然后輸出* 使用電源適配器輸入AC* AC多少呢* adapterOutput* 單位* 加上輸出* 輸出直流電DC* adapterOutput* 然后加上符號* * */System.out.println("使用PowerAdapter輸入AC:"+adapterInput+"V"+"輸出DC:"+adapterOutput+"V");/*** 這個時候把adapterOutput返回回去* * */return adapterOutput;}} package com.learn.design.pattern.structural.adapter;/*** * @author Leon.Sun**/ public class Test {public static void main(String[] args) {/*** 首先目標new一個PowerAdapter* * */DC5 dc5 = new PowerAdapter();/*** 然后直接調用電源適配器的outputDC5V* 非常簡單* 通過適配器就是這樣簡單* 結果已經輸出了* 首先在AC220這個類里面* 輸出了交流電220V* 然后通過PowerAdapter輸出* 輸入是220V的交流電* 輸出是5V的直流電* 和我們預期是一致的* * */dc5.outputDC5V();} }

?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。