1. 程式人生 > >java裝飾模式和介面卡模式區別

java裝飾模式和介面卡模式區別

設計模式是開發的核心,在開發程式猿到後面的日子裡必須要理解並掌握的內容。在這裡,本人對介面卡模式和裝飾模式的一些理解進行分享,如果有哪些不對的地方請見諒,或者通過留言告知,讓我們共同進步。

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