淺談Java設計模式之裝飾器模式

裝飾器模式是指容許對一個現有的對象加入其它額外的功能而且不改變其原來的結構,屬於結構型模式。這種模式一般會建立一個裝飾類來包裝原有的類以達到裝飾的效果。如下舉一個電腦配置的例子說明。
java


首先建立一個電腦的接口,給出兩個抽象方法,分別是獲取名字和獲取價格:ide

/**
 * 抽象電腦類
 * @author 櫻桃肉丸子
 */
public interface AbstractComputer {
    String name();
    double price();
}

建立一個普通電腦類實現上面的接口:this

/**
 * 普通電腦類
 * @author 櫻桃肉丸子
 */
public class Computer implements AbstractComputer {
    @Override
    public String name() {
        return "普通電腦";
    }

    @Override
    public double price() {
        return 3000;
    }
}

如今有一個需求就是須要給這臺普通的電腦加一個內存或是加一個硬盤,即在現有的基礎上對該電腦進行裝飾。對象

首先須要建立一個裝飾類接口來肯定加入的是哪一種配置,這樣邏輯上是說得通的,電腦配件依附於電腦,和電腦有相同的屬性。blog

/**
 * 裝飾類接口
 * @author 櫻桃肉丸子
 */
public interface Device extends AbstractComputer {
    String name();
    double price();
}

分別建立裝飾類的實現類來定義具體裝飾內容:繼承

/**
 * 內存類
 * @author 櫻桃肉丸子
 */
public class Memory implements Device {
    public AbstractComputer computer;

    public Memory(AbstractComputer computer) {
        this.computer = computer;
    }

    @Override
    public String name() {
        return computer.name()+"加內存";
    }

    @Override
    public double price() {
        return computer.price()+300;
    }
}
/**
 * 硬盤類
 * @author 櫻桃肉丸子
 */
public class HardDisk implements Device {
    public AbstractComputer computer;

    public HardDisk(AbstractComputer computer) {
        this.computer = computer;
    }
    @Override
    public String name() {
        return computer.name()+"加硬盤";
    }

    @Override
    public double price() {
        return computer.price()+500;
    }
}

最後寫一個demo來看一下裝飾效果如何:
接口

public class DecoratorPatternDemo {

    public static void main(String[] args) {

        //建立普通的電腦
        Computer computer = new Computer();

        //給普通電腦加硬盤
        HardDisk hardDisk = new HardDisk(computer);
        System.out.println(hardDisk.name());
        System.out.println(hardDisk.price());

        //給普通電腦加內存
        Memory memory = new Memory(computer);
        System.out.println(memory.name());
        System.out.println(memory.price());

        //給普通電腦加硬盤和內存
        Memory memory1 = new Memory(hardDisk);
        System.out.println(memory1.name());
        System.out.println(memory1.price());

    }

}

輸出結果:
內存

image.png


總結:it

裝飾器的價值就體如今「裝飾」上,他只是裝飾,並不會改變原來對象的性質。固然,以上功能也能夠經過繼承實現,但當一個對象出現一個新的功能就要建立一個子類這樣是不合理的。裝飾器模式動態添加功能大大提升了拓展性,必定程度上下降了子類的數量,下降了耦合度。class

相關文章
相關標籤/搜索