設計模式--->靜態代理模式
阿新 • • 發佈:2020-12-27
1.代理模式
Spring的AOP就是典型的代理模式實現的,代理模式常用於外圍,不影響主業務的一種實現(如日誌,事物,日誌檢測等)
1.什麼是代理模式
通過代理為原始類增加額外功能
好處:有利於目標類的維護,增強的更能是可插拔的。
2.名詞解釋
目標類:如UserServiceImpl
目標方法: login(String username,String password)
額外功能:日誌、效能檢測、統一異常處理
3.代理類和原始類的關係。
均實現同一個介面,對目標類進行增強。
4.具體程式碼如下
介面:UserService.java
public interface UserService {public void login(String username,String password); }
目標類:OrderServiceImpl.java
package proxy.service.impl; import proxy.service.UserService; public class UserServiceImpl implements UserService { @Override public void login(String username, String password) { System.out.println("UserServiceImpl.login 我是【service核心】"); } }
代理類:OrderServiceImplProxy
package proxy.service.impl; public class UserServiceImplProxy implements UserService { // 需要對目標方法進行增強就需要先拿到目標類 UserService userService = new UserServiceImpl(); @Override public void login(String username, String password) { System.out.println("UserServiceImplProxy.login 【service外圍】"); userService.login(username,password); } }
測試
@Test public void test1() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext5.xml");
UserService userService = (UserService)ctx.getBean("userService");
userService.login("zhangsan","111111");
}
注意這裡在applicationContext5.xml的檔案中需要注入代理類;
總結
- 靜態代理有哪些優勢:
- 可以對原有方法進行加強。
- 靜態代理有哪些劣勢:
- 類會增多一倍,會給類的管理帶來難度
- 類中的冗餘程式碼多,比如目標方法的前置增強邏輯和後置增強邏輯均需要在每一個代理類中寫一次。
- 有沒有更為高明的辦法呢?
有的,可以使用spring的動態代理。