靜態代理是一種編譯期增強,還沒運行就已經知道增強的目標對象。
裝飾者是運行時增強,只有運行時才知道具體增強的目標。
- 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();
}
}