裝飾器模式

  在實踐生產中,新需求老是不斷的出現。咱們能夠直接修改已有的組件代碼而且添加相應的功能,這顯然破壞了已有組件的穩定性,修改完成後,整個組件須要從新測試。違背了開閉原則。設計模式

   咱們可使用繼承方式,經過建立子類添加新功能實擴展。這種方法是靜態的,用戶不能控制增長行爲的方式和時機。並且有些狀況下繼承是不可行的,例若有些組件被final修飾。另外,若是待添加的新功能存在多種組合方式 ,會致使大量的子類出現。例若有4個待添加的新功能,系統須要動態使用任意多個功能的組合,則須要添加15個子類才能知足需求。ide

裝飾器模式可以幫助咱們解決上述問題。類圖以下測試

                  

 

  假如如今有一塊蛋糕,其它什麼都不加,就是奶油蛋糕。若是加上草莓就是草莓蛋糕,若是加上巧克力,而後插上蠟燭,就變成了一塊生日蛋糕了。不管是奶油蛋糕,草莓蛋糕,仍是生日蛋糕,它們的核心都是蛋糕。像這樣不斷的爲對象添加裝飾的設計模式被稱爲Decorator模式。UML 類圖以下ui

代碼以下this

package decorator;

/**
 * Created by dingshuangkun on 2018/1/27.
 * 蛋糕接口
 */
public interface Cake {

    /**
     * 塗抹奶油
     */
    void  makeCream();
    /**
     * 包裝
     */
    void pack();

    /**
     * 生產蛋糕
     */
    void make();
}

 

package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.蛋糕
 * 奶油蛋糕
 */
public class CreamCake  implements Cake{

    @Override
    public void makeCream() {
        System.out.println("-------塗抹奶油-----");

    }

    @Override
    public void pack() {
        System.out.println("------包裝----------");
    }

    @Override
    public void make() {
        makeCream();
        pack();
    }
}

 

package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 */
public  class Decorator implements Cake {

    private Cake cake;

    public Decorator(Cake cake) {
        this.cake = cake;
    }

    @Override
    public void makeCream() {
        cake.makeCream();
    }

    @Override
    public void pack() {
       cake.pack();
    }

    @Override
    public void make() {
        cake.make();
    }
}
package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 */
public class ChocolateCake extends Decorator {

    public ChocolateCake(Cake cake) {
        super(cake);
    }

    private void addChocolate(){
        System.out.println("-----添加巧克力-----");
    }
    @Override
    public void make() {
        addChocolate();
    }
}
package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 *
 * 水果蛋糕
 */
public class FruitCake extends Decorator {

    public FruitCake(Cake cake) {
        super(cake);
    }

    private void addFruit(){
        System.out.println("---添加水果---");
    }
    @Override
    public void make() {
        super.makeCream();
        addFruit();
    }
}

 

package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 * 生日蛋糕
 */
public class BirthdayCake extends Decorator {

    public BirthdayCake(Cake cake) {
        super(cake);
    }

    private void addCandle(){
        System.out.println("-----添加蠟燭-------");
    }
    @Override
    public void make() {
       addCandle();
       super.pack();
    }
}
package decorator.imp;

import decorator.Cake;

/**
 * Created by dingshuangkun on 2018/1/27.
 */
public class Client {

    public static void main(String[] args) {
        Cake cake = new CreamCake();
        cake = new Decorator(new FruitCake(cake));
        cake.make();
        cake = new Decorator(new ChocolateCake(cake));
        cake.make();
        cake = new Decorator(new BirthdayCake(cake));
        cake.make();
    }
}

運行結果設計

-------塗抹奶油-----
---添加水果---
-----添加巧克力-----
-----添加蠟燭-------
------包裝----------code

Process finished with exit code 0
 對象

相關文章
相關標籤/搜索