1. 程式人生 > 其它 >java23設計模式---class06.裝飾者模式(Decorator)

java23設計模式---class06.裝飾者模式(Decorator)

技術標籤:java設計模式裝飾者模式

文章目錄

1、裝飾者模式是什麼

裝飾者模式,顧名思義,是用於裝飾的一種設計模式。

我們在這個背景下來思考:
有一條小狗,我們給它穿衣服,戴圍巾怎麼做呢?

或許大多數新手都會用繼承的方法,也就是先建立一個Dog類,然後建Dog_Clothes類去繼承Dog就可以讓小狗穿上衣服,Dog_Clothes_Scraft去繼承Dog_Clothes就可以讓穿上衣服的小狗戴上圍巾。

或許你會認為這種模式並無什麼明顯的弊端,但是,如果裝飾多了的時候呢?比如我們再給這小狗戴上手套,戒指甚至給他上百個裝飾的時候,這時就會產生大量的類從而出現類爆炸。這個例子告訴我們,繼承類裝飾這種方法在裝飾品較多的情況下並不科學可行。那麼,在裝飾品不多的時候就可以使用繼承裝飾法嗎?我們來看另一種情況,假如我們給狗戴上一枚戒指只需要Dog_Ring

類,如果戴上第二枚戒指呢?可以用Dog_Ring_Ring去繼承Dog_Ring,也可以直接用Dog_Ring_Ring去繼承Dog呢,這兩種方法顯然都不方便拓展,假如我們還需要戴三隻戒指的小狗,戴四隻戒指的小狗,戴五隻戒指的小狗呢?都需要新建一個類,並不具有良好的可拓展性,這是因為程式碼間的耦合度過高。那麼,是否有一種方法可以使裝飾品具有良好的拓展性呢?怎麼在不過度增加系統負擔的同時讓小狗多穿幾件衣服呢?這時我們從前輩大佬的經驗中可以總結出一種設計模式:裝飾品模式。

2、程式碼實現:

裝飾者模式介紹:裝飾者模式中主要涉及兩種類,一是裝飾器類,二是元件類,為了實現程式碼的拓展性,符合開閉原則:一個軟體實體例如類,模組和函式應對拓展開放,對修改關閉

,我們把裝飾器類和元件類抽象出兩個抽象類或者介面(形容詞用介面,名詞用抽象類),且抽象裝飾類應該是元件抽象類的子類。

1、元件類

package pattern.decorate;
//動物抽象類
public abstract class BaseAnimals {
abstract String show();
}

2、元件實現類

package pattern.decorate;
//貓類
public class Cats extends BaseAnimals{

	@Override
	String show() {
		// TODO Auto-generated method stub
return "cat"; } @Override public String toString() { return "cat"; } }
ackage pattern.decorate;
//狗類
public class Dogs extends BaseAnimals{

	@Override
	String show() {
		// TODO Auto-generated method stub
		return "dog";
	}

	@Override
	public String toString() {
		return "dog";
	}

}

3、裝飾器抽象類

package pattern.decorate;

public abstract class BaseAnimalsDecorator extends BaseAnimals{
private BaseAnimals animals;
public BaseAnimalsDecorator(BaseAnimals animals) {
	this.animals=animals;
}
@Override
String show() {
	return animals.show();
};
}

4、具體裝飾器類

package pattern.decorate;

public class AddClothes extends BaseAnimalsDecorator{
	public AddClothes(BaseAnimals animals) {
		super(animals);
		// TODO Auto-generated constructor stub
	}

	@Override
	String show() {
		// TODO Auto-generated method stub
		return (super.show()+"+衣服");
	}

	@Override
	public String toString() {
		return super.show();
	}

}
package pattern.decorate;

public class AddScraf extends BaseAnimalsDecorator{

	public AddScraf(BaseAnimals animals) {
		super(animals);
		// TODO Auto-generated constructor stub
	}
	@Override
	String show() {
		// TODO Auto-generated method stub
		return super.show()+"+圍巾";
	}
}

5、測試類

package pattern.decorate;

public class DecoratePatternTest {
public static void main(String[] args) {
	BaseAnimals dogs=new Dogs();
	//給狗穿一件衣服
    dogs=new AddClothes(dogs);
    //給小狗再穿一件衣服
	dogs=new AddClothes(dogs);
	//給狗戴一件圍巾
	dogs=new AddScraf(dogs);
	System.out.println(dogs.show());
}
}

結果:
在這裡插入圖片描述