java23設計模式---class06.裝飾者模式(Decorator)
阿新 • • 發佈:2021-02-06
文章目錄
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());
}
}
結果: