- 非常感謝你閱讀本文,歡迎【👍點贊】【?收藏】【📝評論】~
- 放棄不難,但堅持一定很酷!希望我們大家都能每天進步一點點!🎉
- 本文由 二當家的白帽子 https://le-yi.blog.csdn.net/ 博客原創
文章目錄
- 什么是裝飾者模式
- 裝飾者模式中的角色
- 抽象構件(Component)角色
- 具體構件(Concrete Component)角色
- 裝飾(Decorator)角色
- 具體裝飾(Concrete Decorator)角色
- 測驗的時候到了
- 尾聲
什么是裝飾者模式
網路百科如下:
裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動態地擴展一個物件的功能,它是通過創建一個包裝物件,也就是裝飾來包裹真實的物件,
設計模式和編程語言無關,但是二當家的依然用Java語言去實戰舉例,
裝飾者模式中的角色

- 抽象構件(Component)角色:給出一個抽象介面,以規范準備接收附加責任的物件,
- 具體構件(Concrete Component)角色:定義一個將要接收附加責任的類,
- 裝飾(Decorator)角色:持有一個構件(Component)物件的實體,并實作一個與抽象構件介面一致的介面,
- 具體裝飾(Concrete Decorator)角色:負責給構件物件添加上附加的責任,
抽象構件(Component)角色
用動物介面作為抽象構件(Component)角色,動物會移動,和咬,
package com.secondgod.decorator;
/**
* 動物
*
* 抽象構件(Component)角色
*
* @author 二當家的白帽子 https://le-yi.blog.csdn.net/
*/
public interface Animal {
/**
* 移動
*/
void move();
/**
* 咬你
*/
void bite();
}
具體構件(Concrete Component)角色
用會跑會咬的狗狗類作為具體構件(Concrete Component)角色,
package com.secondgod.decorator;
/**
* 狗
*
* 具體構件(Concrete Component)角色
*
* @author 二當家的白帽子 https://le-yi.blog.csdn.net/
*/
public class Dog implements Animal {
@Override
public void move() {
System.out.println("狗子跑起來吧,,,,,");
}
@Override
public void bite() {
System.out.println("狗子生氣了,咬你,,,,,");
}
}
裝飾(Decorator)角色
二當家為動物設計了裝備,可熱插拔,牛得很,
package com.secondgod.decorator;
/**
* 動物裝備
*
* 裝飾(Decorator)角色
*
* @author 二當家的白帽子 https://le-yi.blog.csdn.net/
*/
public abstract class AnimalEquipment implements Animal {
private Animal animal;
public AnimalEquipment(Animal animal) {
this.animal = animal;
}
@Override
public final void move() {
beforeMove();
animal.move();
afterMove();
}
@Override
public final void bite() {
beforeBite();
animal.bite();
afterBite();
}
/**
* 移動前的能力增強
*/
protected abstract void beforeMove();
/**
* 移動后的能力增強
*/
protected abstract void afterMove();
/**
* 咬你前的能力增強
*/
protected abstract void beforeBite();
/**
* 咬你后的能力增強
*/
protected abstract void afterBite();
}
具體裝飾(Concrete Decorator)角色
二當家覺得狗狗跑得有點慢,于是二當家設計了一件動物加速裝備,不要太先進哦,
package com.secondgod.decorator;
/**
* 動物加速裝備
*
* 具體裝飾(Concrete Decorator)角色
*
* @author 二當家的白帽子 https://le-yi.blog.csdn.net/
*/
public class AnimalAcceleratorEquipment extends AnimalEquipment {
public AnimalAcceleratorEquipment(Animal animal) {
super(animal);
}
@Override
protected void beforeMove() {
System.out.println("打開加速引擎,,,,,");
}
@Override
protected void afterMove() {
System.out.println("關閉加速引擎,,,,,");
}
@Override
protected void beforeBite() {
}
@Override
protected void afterBite() {
}
}
有的小動物會被大的動物欺負,于是二當家的為他們設計一款攻擊力增強裝備來保護自己,不要太猛哦,
package com.secondgod.decorator;
/**
* 動物保護裝備
*
* 具體裝飾(Concrete Decorator)角色
*
* @author 二當家的白帽子 https://le-yi.blog.csdn.net/
*/
public class AnimalProtectionEquipment extends AnimalEquipment{
public AnimalProtectionEquipment(Animal animal) {
super(animal);
}
@Override
protected void beforeMove() {
}
@Override
protected void afterMove() {
}
@Override
protected void beforeBite() {
System.out.println("安裝合金牙套,,,,,");
}
@Override
protected void afterBite() {
System.out.println("取下合金牙套,,,,,");
}
}
測驗的時候到了
package com.secondgod.decorator;
public class Test {
public static void main(String[] args) {
System.out.println("一只善良小狗子散步中,,,,,");
Animal animal = new Dog();
System.out.println("一只兇猛大狗出現,前來欺負善良小狗,,,,,");
System.out.println("趕緊為善良小狗裝上保護裝備,反擊的時候到了,,,,,");
animal = new AnimalProtectionEquipment(animal);
animal.bite();
System.out.println("糟糕了,有點過了,跑路吧,小狗子移動太慢了,裝上加速裝備,,,,,");
animal = new AnimalAcceleratorEquipment(animal);
animal.move();
}
}

好了,安全到家,Nice,
如果要是用繼承的方式,要多出來很多類:加速不合金的狗子,合金不加速的狗子,又加速又合金的狗子,以后可能還要有加速不合金的貓,合金不加速的貓,又加速又合金的貓,
尾聲
為了更明確的說明裝飾者模式不增加或減少行為,而是行為的增強,所以裝飾角色使用抽象類并且是final方法來舉例,這樣嚴格限制了具體裝飾角色僅決定如何增強行為,而不改變行為的多少,事實上裝飾角色也可以是介面,
裝飾者模式太好用了,熱插拔,你不用改變,就讓你的能力變強了,

推薦繼續閱讀:java 設計模式實戰,合成模式之神奇的樹結構
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/296654.html
標籤:其他
上一篇:kmp演算法詳解
