設計模式--->靜態代理模式

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的文件中需要注入代理類;

 

總結

  1. 靜態代理有哪些優勢:
  • 可以對原有方法進行加強。
  1. 靜態代理有哪些劣勢:
  • 類會增多一倍,會給類的管理帶來難度
  • 類中的冗餘代碼多,比如目標方法的前置增強邏輯和後置增強邏輯均需要在每一個代理類中寫一次。
    1. 有沒有更爲高明的辦法呢?
      有的,可以使用spring的動態代理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章