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

設計模式之 - 裝飾者模式

一、什麼是裝飾者模式

裝飾著模式:簡單的一句話理解就是,動態的給一個物件新增一些額外的功能,裝飾者模式相對於生成子類更加的靈活。

我們來看下裝飾者模式的UML圖:

二、裝飾者模式的構成

  • Component(抽象構件):它是裝飾類和具體構件的公共父類;

  • ConcreteComponent(具體構件):具它是抽象構件物件的子類,用來定義具體的構件物件;

  • Decorator(抽象裝飾類):進繼承抽象構件,用於給具體的構件新增一些新的職責;

  • ConcreteDecoraror(具體裝飾類):實現了抽象裝飾類,它負責向構件新增新的職責;

三、例項演示

業務場景:現我們現在模擬這樣一個場景,我們點了一杯奶茶,然後給奶茶中加了冰塊,加了珍珠,最後我們還想再給加點紅豆,這裡加紅豆就使用了裝飾者。

我們下來建立一個奶茶的抽象類,想到於Component

public interface MilkyTea {

   public void recipe();
}

我們再來建立要給奶茶的具體子類,相當於ConcreteComponent

public class MilkyTeaA implements MilkyTea {

   @Override
   public void recipe() {

       System.out.println("老闆來一杯奶茶,加冰塊");
   }
}

接下來建立一個裝飾類,相當於Decorator

public class Decorator implements MilkyTea {

   private MilkyTea milkyTea;

   public void setMilkyTea(MilkyTea milkyTea) {

       this.milkyTea = milkyTea;
   }

   @Override
   public void recipe() {

       milkyTea.recipe();
   }
}

建立裝飾類的子類,新增珍珠,相當於ConcreteDecorator

public class MilkyTeaADecorator extends Decorator {

   @Override
   public void recipe() {
       super.recipe();
       recipeZZ();
   }

   // 加珍珠
   public void recipeZZ() {

       System.out.println("老闆再加點珍珠吧");
   }
}

建立裝飾者的子類,新增紅豆,相當於ConcreteDecorator

public class MilkyTeaBDecorator extends Decorator {

   @Override
   public void recipe() {

       super.recipe();
       recipeHD();
   }

   public void recipeHD() {

       System.out.println("老闆你再給加點紅豆吧");
   }
}

最後我們測試一下看下結果:

public class Test {

   public static void main(String[] args) {

       MilkyTeaA milkyTea = new MilkyTeaA();

       MilkyTeaADecorator milkyTeaA = new MilkyTeaADecorator();
       MilkyTeaBDecorator milkyTeaB = new MilkyTeaBDecorator();

       milkyTeaA.setMilkyTea(milkyTea);
       milkyTeaB.setMilkyTea(milkyTeaA);

       milkyTeaB.recipe();
   }
}

四、模式總結

通過這個小例子我們可以發現,裝飾者模式是為了已有的功能動態的新增更多功能的一種方式。

裝飾模式的優點:把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類;