JAVA的23種設計模式---介面卡模式
阿新 • • 發佈:2019-02-06
概要:
該文章參考了《設計模式之禪》一書及一些前輩的部落格文章
1.該文章闡述了介面卡模式的基礎原理及示例程式碼;
2.該文章適合初學設計模式的技術人員研習;
3.該文章有許多不足之處,請各位大咖指正,噴子繞道;
正文:
介面卡模式(變壓器模式、包裝模式):將一個類的介面變成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。
1.介面卡模式示例程式碼實現:
package com.csdn2;
/**
* HDMI線
* @author Administrator
*
*/
public interface HdmiLine {
//通過HDMI線傳遞資料
public void getComputerInfoByHDMI();
}
package com.csdn2;
/**
* HDMI介面
* @author Administrator
*
*/
public class HDMI implements HdmiLine {
@Override
public void getComputerInfoByHDMI() {
System.out.println("通過HDMI介面輸出資料中...");
}
}
package com.csdn2;
/**
* DVI線
* @author Administrator
*
*/
public interface DviLine {
//通過DVI線傳遞資料
public void getComputerInfoByDVI();
}
package com.csdn2;
/**
* DVI介面
* @author Administrator
*
*/
public class DVI implements DviLine {
@Override
public void getComputerInfoByDVI() {
System.out.println("通過DVI介面輸出資料中..." );
}
}
package com.csdn2;
/**
* 介面卡
* @author Administrator
*
*/
public class Adapter extends DVI implements HdmiLine{
//介面卡將DVI輸出轉換為HDMI輸出
public void getComputerInfoByHDMI(){
System.out.println("添加了將DVI介面轉換為HDMI介面的轉換頭,實際還是由DVI介面輸出資料");
super.getComputerInfoByDVI();
}
}
package com.csdn2;
/**
* 模擬顯示器接收資料
* @author Administrator
*
*/
public class Monitor {
public static void main(String[] args) {
//一條HDMI連線線,直接連線了電腦的HDMI資料輸出介面
HdmiLine hdmiLine = new HDMI();
//HDMI連線線傳輸資料
hdmiLine.getComputerInfoByHDMI();
System.out.println("<--------->");
//一條HDMI連線線,通過DVI轉HDMI的轉換頭連線著電腦的DVI資料輸出介面
HdmiLine hdmiLine2 = new Adapter();
//HDMI連線線傳輸資料
hdmiLine2.getComputerInfoByHDMI();
}
}
輸出:
通過HDMI介面輸出資料中...
<--------->
添加了將DVI介面轉換為HDMI介面的轉換頭,實際還是由DVI介面輸出資料
通過DVI介面輸出資料中...
注:
a:該示例講述了實際生活中某個人的電腦顯示卡上有HDMI介面和DVI介面,而顯示器只有HDMI介面,該人還擁有一根HDMI線和一個DVI轉HDMI的轉換頭,他可以選擇使用(顯示卡HDMI介面—HDMI線—顯示屏HDMI介面)的方式對2者進行連線,也可以選擇通過(顯示卡DVI介面—DVI轉HDMI轉換頭—HDMI線—顯示屏HDMI介面)的方式對2者進行連線,其中這裡的轉換頭,就是介面卡模式的核心角色。
b:介面卡模式擁有目標角色、源角色、和介面卡角色三個角色。
c:例項中通過繼承進行的適配,叫做類介面卡,類介面卡是類間繼承。
d:通過委託進行的適配,叫做物件介面卡,它的委託是通過物件層次的關聯關係進行委託的,一般適用於與外界多個實現類通訊。
2:通用介面卡模式模板程式碼實現:
package com.csdn;
/**
* 目標角色
* @author Administrator
*
*/
public interface Target {
//目標角色自己的方法
public void request();
}
package com.csdn;
/**
* 目標角色實現類
* @author Administrator
*
*/
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("if you need any help,pls call me!");
}
}
package com.csdn;
/**
* 源角色
* @author Administrator
*
*/
public class Adaptee {
//原有業務邏輯
public void doSomething(){
System.out.println("I'm kind of busy,leave me alone,pls!");
}
}
package com.csdn;
/**
* 介面卡角色
* @author Administrator
*
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.doSomething();
}
}
package com.csdn;
/**
* 場景類
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
//原有業務邏輯
Target target = new ConcreteTarget();
target.request();
//增加介面卡之後業務邏輯
Target target2 = new Adapter();
target2.request();
}
}
輸出:
if you need any help,pls call me!
I'm kind of busy,leave me alone,pls!