java 介面卡 設計模式 詳解
阿新 • • 發佈:2018-12-18
java 介面卡 設計模式
介面卡模式:將一個類的介面換成客戶希望的另外一個藉口。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
oo設計原則:
- 面向介面程式設計(面向抽象程式設計)
- 封裝變化
- 多用組合,少用繼承
- 對修改關閉,對擴充套件開放
在我們日常開發中,設計某項需求的時候沒有考慮周全,在擴充套件新的需求的時候,原來的介面就不能用了,如果我們一定要用原來的介面,這時候就需要介面卡了,就如上圖中的C。
程式碼案例: 1.首先需要定義一個電源A介面 有一個連線的功能
package adapter;
public interface PowerA {
public void insert();
}
2.定義一個類來實現這個介面
package adapter;
public class PowerAImpl implements PowerA{
public void insert() {
System.out.println("電源開始工作");
}
}
3.定義一個測試類,其中有一個靜態的方法,讓電源A開始工作,必須傳入一個PowerA型別的實現。
package adapter;
public class Test {
public static void main(String[] args) {
PowerA powerA = new PowerAImpl();
work(powerA);
}
public static void work(PowerA a) {
System.out.println("正在連線...");
a.insert();
System.out.println("工作完成");
}
}
4.此時我有拓展了一個PowerB介面的業務,想用測試類A的方法,使電源B工作。我不可能從新寫一個方法,假如業務拓展的非常多咋辦,程式碼都重複了,再說設計原則是對修改關閉的。
package adapter;
public interface PowerB {
public void insert();
}
class PowerBImpl implements PowerB{
public void insert() {
System.out.println("電源B開始工作");
}
}
5.我想在測試類中使用原有的方法,但是原有的方法只接受A型別的介面,這是我們需要一個介面卡,如圖的C,來使A相容B。 通過介面卡把B型別轉換成A型別
package adapter;
/**
* 定義一個PowerA型別的介面卡 類
* 定義一個 PowerB 的屬性
* 傳入一個 PowerB 型別的物件,來執行連線這個功能
*/
public class Adapter implements PowerA{
private PowerB powerB;
//構造方法
public Adapter(PowerB powerB) {
this.powerB = powerB;
}
public void insert(){
powerB.insert();
}
}
6.最後的測試類 如下:
package adapter;
public class Test {
public static void main(String[] args) {
PowerA powerA = new PowerAImpl();
work(powerA);
PowerB powerB = new PowerBImpl();
//work(powerB);
PowerA adapter = new Adapter(powerB);
work(adapter);
}
public static void work(PowerA a) {
System.out.println("正在連線...");
a.insert();
System.out.println("工作完成");
}
}
結果如下:
即完成相容的問題
介面卡還有另外的用法:
假如有一個動物介面,裡面有 跑、吃、說話、游泳的方法
package adapter;
public interface Animal {
public void run();
public void eat();
public void sing();
public void swim();
}
當我想實現一個狗的類,我只住注重跑這個方法,其他的方法我不在意,但是,一個類想要實現一個介面,必須實現介面中的所有方法,你可以寫空實現,,假如想要實現各種各樣的動物,如果都要寫的話,估計我們會哭暈在廁所。 這時 適配就可以起到意想不到的功能
定義一個抽象類,去實現動物這個介面,其中的方法都進行空實現。讓狗類去繼承這個抽象類,只重寫跑這個方法就可以了。
package adapter;
public abstract class AnimalFunction implements Animal{
public void run() {}
public void eat() {}
public void sing() {}
public void swim() {}
}
最後用狗這個類去繼承上面的那個抽象類, 狗類中只重寫跑這個方法即可。
package adapter;
public class Dog extends AnimalFunction{
public void run() {
System.out.println("我是一條狼狗,捉羊輕而易舉");
}
}