1. 程式人生 > >Java設計模式02-裝飾者模式

Java設計模式02-裝飾者模式

繼承 cor tree 直接 分享 println extend fir tor

定義

動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。

類圖

技術分享圖片
(圖片來自headfirst 設計模式)

Java實例

在網遊中通常有各式各樣的武器,還可以通過附魔給武器添加各種攻擊特效,現在我們通過裝飾者模式來實現一下這個效果。

/**
 * 武器劍類,武器接口的實現類。對應上圖的ConcreteComponnet類
 * @author ZJ
 */
public class Sword implements Weapon{

    @Override
    public void attack() {
        System.out.println("用劍刺");
    }

}

/**
* 武器劍類,武器接口的實現類。對應上圖的ConcreteComponnet類
* @author ZJ
*/
public class Sword implements Weapon{
@Override
   public void attack() {
       System.out.println("用劍刺");
  }
}

 /**
 * 附魔抽象類,對應上圖的Decorator類。
 * 實現Weapon接口,是因為武器附魔後還可以當成武器來使用。
 * @author ZJ
 *
 */
public abstract class Enchantment implements Weapon {
    protected Weapon weapon;
    //通過構造方法傳入需要裝飾的對象
    public Enchantment(Weapon weapon) {
        this.weapon = weapon;
    }
   //抽象攻擊方法,每一個具體的附魔裝飾者類都應該有它的實現。
   public abstract void attack();
}

/**
 * 火屬性附魔類。對應途中ConcreteDecorator類
 * 這是一個具體的裝飾者實現類
 * @author ZJ
 *
 */
public class EnchantingWithFire extends Enchantment{

    public EnchantingWithFire(Weapon weapon) {
        super(weapon);
    }

    //實現具體的攻擊方法
    public void attack() {
        // TODO Auto-generated method stub
        System.out.print("火屬性攻擊特效--------");
        weapon.attack();
    }

}

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Weapon sword = new Sword();
        Weapon fireSword = new EnchantingWithFire(sword);
        sword.attack();
        fireSword.attack();
    }

}
輸出結果:
用劍刺
火屬性攻擊特效--------用劍刺

看完這麽上面的例子你可能覺得幹嘛這麽麻煩,寫一堆接口和類,我直接寫一個火屬性攻擊特效的劍類和一個普通的劍類就好啦。的確在我們上面的例子中或許直接寫兩個類是更好的方式但是在網遊中,武器可不止劍一種,說不定有什麽倚天劍、屠龍刀、打狗棒、殺豬刀等等。附魔的屬性也可能有光、冰、火等等這樣的話直接寫類的方式就要寫光屬性倚天劍、冰屬性倚天劍、火屬性倚天劍相當於武器種類數 * 附魔種類數的類的一大堆類而我們例子的實現方式就只需要武器種類數+附魔種類數的類。而且每添加一種武器我們也只需要添加一個普通武器類就好了,不需要考慮各種附魔的類。

其他

對於裝飾者模式,更多的可以參考java io的類庫。
github:https://github.com/Panici4/DesignPattern/tree/master/decorator

Java設計模式02-裝飾者模式