1. 程式人生 > 其它 >Java實現裝飾者模式

Java實現裝飾者模式

裝飾者模式(Decorator或Wrapper)
被裝飾者將擴充套件功能的任務委託給裝飾者,從而避免直接修改原來的類(開閉原則:對擴充套件開放,對修改關閉)
裝飾者與被裝飾者擁有同樣的超型別
裝飾者可以在被裝飾者的行為前或行為後,增加自己的行為

裝飾者模式說白了,就是在裝飾者類中持有超類物件,增強超類物件的功能,或者進行擴充套件(雖然極其簡單,但是很有用)。

Java io包中的包裝流就用到了裝飾者模式,用來擴充套件基礎流的功能。

裝飾者模式示例:

小白程式設計師一開始啥都不會

public class Coder
{
    public double getSalary()
    {
        return 0;
    }

    public String getSkill()
    {
        return "啥也不會";
    }
}

私下琢磨了一天後,學會了HelloWorld(增強了超類功能,但沒有修改超類中的程式碼)

public class HelloWorldCoder extends Coder
{
    private Coder coder;

    public HelloWorldCoder(Coder coder)
    {
        this.coder = coder;
    }

    @Override
    public double getSalary()
    {
        return coder.getSalary()+100;
    }

    @Override
    public String getSkill()
    {
        return coder.getSkill()+",會寫HelloWorld了";
    }
}

通過閱讀《Java從入門到精通》,小白終於精通了Java,順便學會了CRUD

public class JavaCoder extends Coder
{
    private Coder coder;

    public JavaCoder(Coder coder)
    {
        this.coder = coder;
    }

    @Override
    public double getSalary()
    {
        return coder.getSalary()+1000;
    }

    @Override
    public String getSkill()
    {
        return coder.getSkill()+",精通Java";
    }

    // 擴充套件功能
    public void curd()
    {
        System.out.println("會寫增刪改查了");
    }
}

小白還在不停的學習新的技能...

測試

public static void main(String[] args)
{
    Coder coder=new Coder();
    System.out.println(coder.getSalary());
    System.out.println(coder.getSkill());

    Coder helloworldCoder=new HelloWorldCoder(coder);
    System.out.println(helloworldCoder.getSalary());
    System.out.println(helloworldCoder.getSkill());

    Coder javaCoder=new JavaCoder(helloworldCoder);
    System.out.println(javaCoder.getSalary());
    System.out.println(javaCoder.getSkill());

    // 使用擴充套件(裝飾類特有)的功能
    JavaCoder crudCoder= (JavaCoder)javaCoder;
    crudCoder.curd();
}

輸出

0.0
啥也不會
100.0
啥也不會,會寫HelloWorld了
1100.0
啥也不會,會寫HelloWorld了,精通Java
會寫增刪改查了