---
# System prepended metadata

title: 靜態代理模式
tags: [Spring-代理模式]

---

# 靜態代理模式
###### tags: `Spring-代理模式`

## 為什麼要學習代理模式？
因為這是SpringAOP的底層實現
【SpringAOP 和 SpringMVC】

## 代理模式分類
* 靜態代理
* 動態代理

## 代理模式圖解
![](https://i.imgur.com/6dc4OEr.png)

## 靜態代理
### 角色分析：
* 抽象角色：一般會使用接口或者抽象類來解決
* 真實角色：被代理角色
* 代理角色：代理真實角色，代理真實角色後，我們一般會做一些附屬操作
* 客戶：訪問代理對象的人

### 代理步驟
1. 接口
```java=
//租房
public interface Rent {
    public void rent();
}
```
2. 真實角色
```java=
//房東
public class Host implements Rent{

    @Override
    public void rent() {
        System.out.println("房東要出租房子");
    }
}
```
3. 代理角色
```java=
//代理
public class Proxy implements Rent{

    private Host host;

    public Proxy() {
    }

    public Proxy(Host host) {
        this.host = host;
    }

    public void rent(){
        seeHouse();
        host.rent();
        hetong();
        fare();
    }

    //看房
    public void seeHouse(){
        System.out.println("仲介帶你看房");
    }

    //簽合約
    public void hetong(){
        System.out.println("簽租物契約");
    }

    //收仲介費
    public void fare(){
        System.out.println("收仲介費");
    }
}
```

4. 客戶端訪問代理角色
```java=
public class Client {
    public static void main(String[] args) {
        //房東要租房子
        Host host = new Host();
        //代理，中介幫房東租房子，代理角色會有一些附屬操作
        Proxy proxy = new Proxy(host);

        //你不用面對房東，直接找中介租房即可
        proxy.rent();//房東要出租房子
    }
}

```

### 代理模式的好處：
* 可以使真實角色的操作更加純粹，不用去關注一些公共的業務
* 公共業務也就交給代理角色，實現了業務的分工
* 公共業務發生擴展的時候，方便集中管理

### 缺點：
* 一個真實角色，就會產生一個代理角色，代碼量會翻倍，開發效率變低

## 加深理解
![](https://i.imgur.com/G8wDzcc.png)
### 改度原有的業務代碼，在公司中是大忌！
為了不改變原有代碼，通過代理對象去調用原有方法，並透過代理對象來追加方法執行

1.接口
```java=
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

```

2.真實對象
```java=
//真實對象
public class UserServiceImpl implements UserService{

    @Override
    public void add() {
        System.out.println("增加一個用戶");
    }

    @Override
    public void delete() {
        System.out.println("刪除一個用戶");
    }

    @Override
    public void update() {
        System.out.println("修改一個用戶");
    }

    @Override
    public void query() {
        System.out.println("查詢一個用戶");
    }

    

}
```

3.代理對象
```java=
public class UserServiceProxy implements UserService{

    public UserServiceImpl userService;

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    @Override
    public void add() {
        log("add");
        userService.add();
    }

    @Override
    public void delete() {
        log("delete");
        userService.add();
    }

    @Override
    public void update() {
        log("update");
        userService.add();
    }

    @Override
    public void query() {
        log("query");
        userService.add();
    }

    //日誌方法
    public void log(String msg){
        System.out.println("[Debug]使用了" + msg +"什麼方法");
    }
}

```

5.客戶端訪問
```java=
public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        UserServiceProxy proxy = new UserServiceProxy();

        proxy.setUserService(userService);

        proxy.add();
    }
}
```