10 代理模式

2023-04-14  本文已影响0人  Messix_1102

为什么要学习代理模式?因为这是Spring AOP的底层!
代理模式的分类:

10.1静态代理

角色分析:

  1. 接口
//租房
public interface Rent {
    public void rent();
}
  1. 真实角色
// 房东
public class Host implements Rent{
    public void rent(){
        System.out.println("房东要出租房子");
    }
}
  1. 代理角色
package com.hunter.demo01;

public class Proxy implements Rent{
    private Host host;

    public Proxy(){
    }

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

    public void rent(){
        seeHouse();
        fee();
        aggrement();
        host.rent();
    }

    public void seeHouse(){
        System.out.println("中介带你看房");
    }

    public void fee(){
        System.out.println("收中介费");
    }

    public void aggrement(){
        System.out.println("签合同");
    }
}
  1. 客户端访问代理角色
package com.hunter.demo01;

public class Client {
    public static void main(String[] args) {
        // 房东租房子
        Host host = new Host();
        // 代理,中介帮房东租房子,有一些附属操作
        Proxy proxy = new Proxy(host);
        // 你不用面对房东,直接租房
        proxy.rent();
    }
}

代理模式的好处:

缺点:

10.2 加深理解

AOP 思想

代理接口

package com.hunter.demo02;

public interface UserService {
    public void add();
    public void update();
    public void delete();
    public void query();
}

被代理类

package com.hunter.demo02;

public class UserServiceImpl implements UserService{
    @Override
    public void add() {
        System.out.println("增加了一个用户");
    }

    @Override
    public void update() {
        System.out.println("修改了一个用户");
    }

    @Override
    public void delete() {
        System.out.println("删除了一个用户");
    }

    @Override
    public void query() {
        System.out.println("查询了一个用户");
    }
}

代理角色

package com.hunter.demo02;

public class UserServiceProxy implements UserService{
    UserServiceImpl userService;
    public UserServiceProxy(UserServiceImpl userService){
        this.userService = userService;
    }

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

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

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

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

    // 日志方法
    public void log(String msg){
        System.out.println("【debug】使用了" + msg+  "方法");
    }
}

客户端

package com.hunter.demo02;

public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        UserServiceProxy proxy = new UserServiceProxy(userService);
        proxy.add();
    }
}

10.3 动态代理

需要理解两个类:Proxy(代理),InvocationHandler(调用处理程序)
动态代理的好处:

上一篇下一篇

猜你喜欢

热点阅读