java裝飾模式和介面卡模式區別
阿新 • • 發佈:2019-01-30
設計模式是開發的核心,在開發程式猿到後面的日子裡必須要理解並掌握的內容。在這裡,本人對介面卡模式和裝飾模式的一些理解進行分享,如果有哪些不對的地方請見諒,或者通過留言告知,讓我們共同進步。
1.首先我們從意思上來區分
裝飾模式:顧名思義就是進行包裝、裝飾,對源類的方法進行包裝。
介面卡模式:就是對輸出介面進行適配,根據不同的需求進行不同的適配功能,變得是目標類,用的還是源類裡面的方法。
2.從構建結構上進行區分
介面卡模式:
從結構上分析,左邊那個物件是目標物件,是我們最終需要的物件,右面那個物件是源類物件,下面那個是介面卡類。
裝飾模式:
從結構中可以分析,裝飾類需要四個角色。
最上面:抽象構建角色,提供一個抽象介面,供外部使用
左邊:具體構建角色,對抽象構建角色進行實現。
右邊:裝飾角色,完成對抽象構建角色的裝飾。
最下面:具體裝飾角色。
3.接下來說下什麼為裝飾角色
1. 既然是裝飾角色,就是對抽象構建角色進行裝飾,那麼就必須有一個抽象構建角色的屬性類。
2.在不改變介面的前提下,增強所考慮類的效能。
4.通過例項來區分
首先建造一個介面卡例項。
首先建造一個源類Kittie:
在該類中有四個方法。public class Kittie { public void maio(){ System.out.println("maio()"); } public void catchRat(){ System.out.println("catchRat()"); } public void run(){ System.out.println("run()"); } public void sleep(){ System.out.println("sleep()"); }
然後在建造一個目標類:
public interface Puppie {
public void wao();
public void fetchBall();
public void run();
public void sleep();
}
這裡目標類我們用介面,仔細觀察我們看到有兩個個方法fetchBall、wao和源類不一樣。到這裡大家應該明白了,我們能夠呼叫的介面類,想要輸出的方法是fetchBall,
而輸出的內容是源類中的catchRat和maio。那麼接下來就需要我們的介面卡類出馬了。
介面卡類:
到這裡,一個介面卡模式的例子已經全部實現。相比大家也能更好的進行理解這種模式了。public class Adapte extends Kittie implements Puppie { public void wao() { this.wao(); } public void fetchBall() { this.catchRat(); } public void run() { super.run(); } public void sleep() { super.sleep(); } }
下面我們建立一個裝飾模式例項
首先建立一個抽象構建類:
public interface Component {
public void sampleFunction();
}
然後我們建立一個具體構建類
public class Compment1 implements Component{
public void sampleFunction() {
System.out.println("具體構建類");
}
}
具體構建類可以不止一個。
然後我們建立裝飾類,接下來該注意了
public class Decorator implements Component {
public Component component;
public Decorator(Component com){
this.component = com;
}
public void sampleFunction() {
component.sampleFunction();
}
}
請看清楚裝飾類的構造,他擁有一個抽象構建類物件,然後來裝飾這個屬性物件,並對抽象類介面進行實現。
接下來我們建立具體裝飾類
具體裝飾類1
public class Decorator1 extends Decorator {
private Component component;
public Decorator1(Component com) {
super(com);
this.component = com;
}
public void sampleFunction(){
component.sampleFunction();
System.out.println("改造方法1");
}
}
具體裝飾類2:
public class Decorator2 extends Decorator {
private Component component;
public Decorator2(Component com) {
super(com);
this.component = com;
}
public void sampleFunction(){
component.sampleFunction();
System.out.println("改造方法2");
}
}
到此裝飾模式類床架完畢。接下來我們來使用main函式進行建立說明使用方法。
public class Test {
public static void main(String[] args) {
Component c1 = new Compment1();
Component c2 = new Decorator(new Decorator1(new Decorator2(c1)));
c2.sampleFunction();
}
}
請仔細看下裝飾物件的建立。向下這個main函式的輸出結果。
輸出結果:
具體構建類
改造方法2
改造方法1