設計模式之靜態代理

先看代碼,認識如下什麼是靜態代理bash

實例

目標類的接口

/**
 * UserService 是 目標類的接口
 * login() 就是要被代理的方法
 */
public interface UserService {
    boolean login(String userName, String password);
}

複製代碼

目標類

注意,要代理的方法,必須從接口中實現ide

/**
 * UserServiceImpl 是目標類,或者叫被代理的類
 * login() 就是要被代理的方法
 */
public class UserServiceImpl implements UserService {

    @Override
    public boolean login(String userName, String password) {
        System.out.println("校驗帳號");
        return false;
    }
}
複製代碼

代理類

注意,要代理的方法,必須從接口中實現測試

/**
 * UserServiceProxy 是代理類,它繼承了 UserService 接口,實現了login()方法
 */
public class UserServiceProxy implements UserService {

    /**
     * 其實就是寫一個新方法把 目標方法包起來
     */
    @Override
    public boolean login(String userName, String password) {
        before();
        UserService userServiceImpl = new UserServiceImpl();
        Object result = userServiceImpl.login(userName, password);
        after();
        return result;
    }

    private void before() {
        System.out.println("調用目標方法以前輸出的log");
    }

    private void after() {
        System.out.println("調用目標方法以後輸出的log");
    }
}
複製代碼

測試類

上面三個類構成了jdk動態代理的最小組成單位,接下來,編寫測試類使用jdk動態代理ui

public static void main(String[] args) {
    // 建立代理對象
    UserService userServiceProxy = new UserServiceProxy();
    // 調用代理方法
    userServiceProxy.login("wqlm", "123");
}
複製代碼

總結

靜態代理設計到三個類spa

  • 目標類的接口 Interface
  • 目標類 target
  • 代理類 Proxy

代理類經過實現目標類的接口,使之與目標類 類型一致。而後在代理方法中調用目標方法,並在調用先後作一些操做。設計

優勢代理

  • 在不更改目標方法的基礎上,對目標方法作加強,下降了系統的耦合度。
  • 代理對象做爲客戶端和目標對象之間的中介,起到了保護目標對象的做用

缺點code

  • 目標類須要實現接口,目標方法須要在接口中存在
相關文章
相關標籤/搜索