意圖將一個(gè)類(lèi)的接口轉換成客戶(hù)希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。(GoF)場(chǎng)景相信很多人都知道什么是顯卡,也有很多人知道顯卡的本名——圖形適配器。恩,是的,正好這回說(shuō)說(shuō)Apater模式,就拿顯卡來(lái)例子來(lái)分析一下Adapter模式。
我們知道顯示器(Client)是用來(lái)顯示圖形的,它是不能顯示數據,它只能夠接受來(lái)自圖形發(fā)送設備Target的信號??墒俏覀兪诸^上只有CPU(Adaptee)這個(gè)產(chǎn)生各種描述圖形的數據的數據發(fā)送器。我們需要將這些數據讓顯示器進(jìn)行顯示,可是這兩個(gè)部件卻是不兼容的。于是我們需要一個(gè)中間設備,它能夠將CPU“適配”于顯示器,這便是我們的顯卡——圖形適配器(Adapter)。
java 代碼
-
- public class Target {
-
-
-
- public String request() {
- return "Graphic sender";
- }
- }
java 代碼
-
- public class Client {
-
- public static void main(String[] args) {
- Target target = new Targete();
- System.out.println(target.request());
- }
- }
可是我們的CPU(Adaptee)只能輸出0/1數據,他是個(gè)計算器,而不是圖形發(fā)送設備(Target)。
java 代碼
-
- public class Adaptee {
-
-
-
- public String getData() {
- return "CPU data";
- }
- }
這個(gè)時(shí)候我們的顯卡(Adapter)的作用便體現出來(lái)了,它負責對CPU進(jìn)行適配,通過(guò)將CPU傳過(guò)來(lái)的數據轉換成圖形信號,從而將CPU偽裝成一個(gè)圖形發(fā)送設備。
java 代碼
-
- public class Adapter extends Target {
-
-
- private Adaptee apt = null;
-
-
-
-
- public Adapter(Adaptee apt) {
- this.apt = apt;
- }
-
-
-
-
- public String request() {
- return apt.getData();
- }
- }
這樣,我們的電腦的顯示流程就變成CPU-顯卡-顯示器:
java 代碼
- public class Client {
-
- public static void main(String[] args) {
-
- Target target = new Adapter(new Adaptee());
- System.out.println(target.request());
- }
-
- }
上面的這種依賴(lài)于對象組合的Adapter模式叫做
對象適配器(Object Adapter)。它的特征是繼承/實(shí)現某一方的類(lèi)(Target),如這里的圖形發(fā)送器,同時(shí)內部包含一個(gè)被適配的類(lèi)(Adaptee),如這里的CPU。通過(guò)重寫(xiě)其父類(lèi)的方法來(lái)進(jìn)行適配。
另一種的Adapter實(shí)現對于A(yíng)dapter模式,還有另外一種實(shí)現方式,這種適配方式叫做
類(lèi)適配器(Class Adapter)。它與Object Adapter的不同之處在于它繼承被適配的對象。
java 代碼
- public class Adapter extends Targer, Adaptee {
- ......
- }
這樣的代碼在C++中是合法的,但是在Java中規定最多只能繼承一個(gè)父類(lèi),而可以實(shí)現多個(gè)接口。所以我們需要建立一個(gè)IAdaptee的接口,然后將我們的Adapter繼承Target同時(shí)實(shí)現IAdaptee。
java 代碼
-
- public interface IAdaptee {
-
- String getData();
- }
java 代碼
-
- public class Adaptee implements IAdaptee {
- ......
- }
java 代碼
- public class Adapter extends Target implements IAdaptee {
-
- private IAdaptee apt = null;
-
- public Adapter(IAdaptee apt) {
- this.apt = apt;
- }
-
- public String request() {
- return apt.getData();
- }
-
- public String getData() {
- return apt.getData();
- }
- }
對于我們的顯示器(Client)方面,Class Adapter跟Object Adapter一樣,所以不需要進(jìn)行修改。
對于Class Adapter,大家也看見(jiàn)了,在A(yíng)dapter中因為是實(shí)現了IAdaptee接口,因此需要實(shí)現getData()的接口。一旦Target和IAdaptee擁有相同的方法時(shí),會(huì )出現麻煩的。所以盡量?jì)?yōu)先使用Object Adapter的模式。
小結作為總結,我覺(jué)得
顯卡本身的定義便很能表達Apater設計模式:“
它是主機與顯示器之間連接的“橋梁”,作用是控制電腦的圖形輸出,負責將CPU送來(lái)的的影象數據處理成顯示器認識的格式,再送到顯示器形成圖象。”
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。