下面是簡單的代碼外加一些我的的理解
代理模式的關鍵在於代理類和被代理類須要實現同一個接口
代理模式實現的時候是不須要記住實現接口類的名稱,僅僅須要記住接口的名稱便可,經過不一樣的接口來實現不一樣的代理類。
此代碼實現的目的:在已有的輸出結果的以前和結束的位置上輸出其餘的信息。以下述的輸出:
//正常的輸出結果:
System.out.println("run ......");
//要實現的樣式:
xxxxxxxxx; //(其中xxxx表示的是爲任意的輸出)
System.out.println("run .......");
xxxxxxxxx; //(其中xxxx同正常輸出以前的輸出)
要像實現上述的方法有兩種辦法:
方法一:(經過繼承來輸出上述的樣式)
//使用繼承實現上述的要求
//定義一個在LogProxy
interface Moveable{
public void move();
}
class Demo implements Moveable{
public void move(){
System.out.println("run........");
}
}
class LogProxy extends Demo {
public void move(){
System.out.println("Car Log start ........");
super.move();
System.out.println("Car Log end ..........");
}
}
class Test{
public static void main(String[] args){
LogProxy lp = new LogProxy ();
lp.move();
}
}
使用上述代碼的能夠實現想要實現的結果,可是缺點是,想要嵌套多個相似的輸出結果的話,須要在繼承多個類,實現起來不方便。
方法二:(經過代理的方式來實現要求)
在寫代碼以前須要理解一個概念就是聚合:我經過查看資料和視頻簡單理解一下聚合的含義是在一個類中包含處除此類外的另外一個類。
import java.util.Random;
interface Moveable{
public void move();
}
class Tank implements Moveable{
public void move(){
System.out.println("run.....");
try{
Thread.sleep(new Random().nextInt(10000)); //此處的含義是將該線程中止一段時間
}catch(Exception e){
System.out.println(e);
}
}
}
class TankTimeProxy implements Moveable{
Moveable t;
public TankTimeProxy(Moveable m){
super();
this. t = m;
}
public void move(){
System.out.println("Time Proxy begin .....");
t.move();
System.out.println("Time Proxy end .......");
}
}
class TankLogProxy implements Moveable{
Moveable t ;
public TankLogProxy(Moveable m){
super();
this.t = m;
}
public void move(){
System.out.println("Log Proxy begin......");
t.move();
System.out.println("Log Proxy end .......");
}
}
class Demo{
public static void main(String[] args){
Moveable m = new Tank();
TankLogProxy tlp = new TankLogProxy(m);
TankTimeProxy ttp = new TankTimeProxy(tlp);
ttp.move();
}
}
//使用代理實現開頭的要求的一個條件是須要將所要使用到的類都須要實現一個統一的接口,上述代碼中實現的接口是Moveable.