靜態代理可以在不改變原有代碼的情況下,增加新的功能和操作,對原有對象進行擴展。 靜態代理要求真實對象和代理對象都實現同一個介面,由代理對象代理真實角色的介面實現,併在實現前後增加新的操作。 public class StaticProxy{ public static void main(Strin ...
靜態代理可以在不改變原有代碼的情況下,增加新的功能和操作,對原有對象進行擴展。
靜態代理要求真實對象和代理對象都實現同一個介面,由代理對象代理真實角色的介面實現,併在實現前後增加新的操作。
public class StaticProxy{
public static void main(String[] args){
Person person = new Person("張三");
//由代理對象代理真實對象的方法
new WeddingCompany(person).happyMarry();
}
}
//要實現的介面
interface Marry{ void happyMarry();}
//真實對象
class Person implements Marry{
private String name;
public Person(String name){this.name = name;}
public void happyMarry(){ //實現介面
System.out.println(this.name + " is gonna married, Happy!");
}
}
//代理對象
class WeddingCompany implements Marry{
private Person person;
public void WeddingCompany(Person person){ this.person = person; }
public void happyMarry(){//實現介面的方法
before(); //代理過程中額外添加的操作
person.happyMarry(); //真實對象的操作
after(); //代理過程中額外添加的操作
}
public void before(){System.out.println("Before wedding, set up the scene...")}
public void after(){System.out.println("After wedding, clean up after...");}
}
在之前的筆記(11)中已經出現過靜態代理了,創建多線程的方法中,提到的第一種方法是直接繼承Thread類,第二種方法是實現Runnable介面,然後創建Thread類,將待執行線程作為參數傳遞進去,調用start()方法啟動。
public static void main(String[] args) {
TestThread testThread = new TestThread();//創建真實對象
new Thread(testThread).start();//由代理對象代理執行
for (int i = 0; i < 5; i++) {
System.out.println("main 方法線程: " + i);
}
}
實際上這就是靜態代理了,TestThread是真實對象,Thread是代理對象,二者都實現了Runnable介面,由Thread類代理執行待執行線程。
靜態代理可以做很多真實對象做不了的事情,而真實對象可以專註做自己的事情。