靜態代理和裝飾者模式的區別


靜態代理是一種編譯期增強,還沒運行就已經知道增強的目標對象。

裝飾者是運行時增強,只有運行時才知道具體增強的目標。

  • Code show time 

  靜態代理:

package com.zjt.test;

interface Duck {
    void swim();
}

class DuckImpl implements Duck{
    @Override
    public void swim() {
        System.out.println("小鴨子會游泳");
    }
}

class ProxyDuck implements Duck{
    Duck duck;
   //一個空的構造函數,且代理類中明確聲明需要代理的目標對象 public ProxyDuck(){ this.duck=new DuckImpl(); } @Override public void swim() { System.out.println("噶嘎嘎。。。"); duck.swim(); } } class Test{ public static void main(String[] args) { Duck duck = new ProxyDuck(); duck.swim(); } }

  裝飾者模式:

package com.zjt.test;

public interface Duck {
    void swim();
}
class DuckImpl implements Duck{

    @Override
    public void swim() {
        System.out.println("swim....");
    }
}

class Director implements Duck{
    Duck duck;
    //編譯期不知道具體的目標對象,只有運行期調用者手動傳入才知道 public Director(Duck duck){ this.duck=duck; } 
    @Override
    public void swim() {
        System.out.println("gagaga.....1");
        duck.swim();
        System.out.println("gagaga.....2");
    }
}


class Test{
    public static void main(String[] args) {
        Duck duck = new Director(new DuckImpl());
        duck.swim();
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM