舉個例子,我是一個包租公,我如今想賣房,可是我不想麻煩,天天被電話騷擾,因此這個時候我找了樓下一個中介,讓他幫我代理這些事,那麼他天然有租房的方法。之後若是有人想租房,直接找中介就好了。html
public interface Sale { public void sale(); } public class Jiajun implements Sale{ public void sale() { // TODO 自動生成的方法存根 System.out.println("jiajun要賣房"); } } public class SaleProxy implements Sale{ Jiajun jiajun=new Jiajun(); @Override public void sale() { // TODO 自動生成的方法存根 jiajun.sale(); } } public Client{ public static void main(String[] args) { Sale saleProxy=new SaleProxy(); saleProxy.sale(); } }
從上面的代碼能夠看出,代理類(SaleProxy)和真實類(Jiajun)好像沒什麼區別,我直接(new Jiajun().sale())不就好了,那麼爲何屢次一舉呢,任何設計都有他的好處。咱們能夠發現代理類能夠在真實類的基礎上增長方法,好比這個時候中介能夠收取買主的費用。java
public class SaleProxy implements Sale{ Jiajun jiajun=new Jiajun(); @Override public void sale() { // TODO 自動生成的方法存根 charge(); jiajun.sale(); } public void charge() { System.out.println("jiajun要賣房,中介要收費"); } }
而這個不關我事,中介你幫我租出去就行。編程
public interface Sale { public void sale(); public void rent(); } public class SaleProxy implements Sale{ Jiajun jiajun=new Jiajun(); @Override public void sale() { // TODO 自動生成的方法存根 jiajun.sale(); } public void rent() { jiajun.rent(); } }
public interface Sale { public void sale(); } public interface Buy { public void buy(); } public class Jiajun implements Sale,Buy{ public void sale() { // TODO 自動生成的方法存根 System.out.println("jiajun要賣房"); } public void buy() { // TODO 自動生成的方法存根 System.out.println("jiajun要買房"); } }
這個時候我要生成兩個代理,那麼我就要建立兩個代理類ide
public class BuyProxy implements Buy{ Jiajun jiajun=new Jiajun(); public void buy() { // TODO 自動生成的方法存根 jiajun.buy(); } } public class SaleProxy implements Sale{ Jiajun jiajun=new Jiajun(); @Override public void sale() { // TODO 自動生成的方法存根 jiajun.sale(); } } public class Client { public static void main(String[] args) { Sale saleProxy=new SaleProxy(); saleProxy.sale(); Buy buyProxy=new BuyProxy(); buyProxy.buy(); } }
若是我要爲多種方法代理,那麼就會產生不少代理類。this
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyHandler implements InvocationHandler{ private Object tar; //綁定委託對象,並返回代理類 public Object bind(Object tar) { this.tar=tar; //綁定該類實現的全部接口,取得代理類 return Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this); } public Object invoke(Object proxy , Method method , Object[] args)throws Throwable { Object result = null; result = method.invoke(tar,args); return result; } } public class Client { public static void main(String[] args) { ProxyHandler proxy = new ProxyHandler(); //綁定該類實現的全部接口 Sale saleProxy = (Sale) proxy.bind(new Jiajun()); saleProxy.sale();; Buy buyProxy=(Buy)proxy.bind(new Jiajun()); buyProxy.buy(); } }