【設計模式】代理模式:靜態代理,動態代理,spring aop
阿新 • • 發佈:2017-08-14
spring 實現接口 找到 master 代碼 -s result java 統一
代理模式分為靜態代理和動態代理。我們拿鏈家來舉例子,我們本人是真實的對象,有真實的業務需求:需要去找房子;鏈家是中介,是代理類,他來幫我執行找房子的這個操作。
靜態代理:
1.實現一個接口
public interface SearchHome { public void search(); }
2.構建實現接口的委托類
public class Master implements SearchHome { @Override public void search() { System.out.println("尋找房子"); } }
3.構建代理類
public class HomeLink implements SearchHome{ private SearchHome sh; public HomeLink(SearchHome sh) { super(); this.sh = sh; } @Override public void search() { System.out.println("鏈家幫您找房子..."); sh.search(); System.out.println("鏈家幫您找到了..."); } }
4.客戶端:
public class Main { public static void main(String[] args) { SearchHome sh = new HomeLink(new Master()); sh.search(); } }
動態代理:
靜態代理是代理類和委托類在java代碼中綁定在一起,不方便管理。相比靜態代理, 動態代理可以很方便的對委托類的方法進行統一處理。動態代理是在java代碼運行時生成,動態代理又分為jdk動態代理和cglib動態代理。
1.定義接口:
public interface SearchHome { void search(); }
2.定義委托類:
public class Master implements SearchHome { @Override public void search() { System.out.println("尋找房子"); } }
3.定義動態代理類
public class MyProxy implements InvocationHandler { private Object target; public MyProxy(Object target) { super(); this.target = target; } public Object newInstance() { return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("鏈家開始找..."); result = method.invoke(this.target, args); System.out.println("鏈家開始找..."); return result; } }
4.main
public class Main { public static void main(String[] args) { SearchHome sh = (SearchHome) new MyProxy(new Master()).newInstance(); sh.search(); } }
【設計模式】代理模式:靜態代理,動態代理,spring aop