美文网首页
10 代理模式

10 代理模式

作者: Messix_1102 | 来源:发表于2023-04-14 14:34 被阅读0次

    为什么要学习代理模式?因为这是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 动态代理

    • 动态代理和静态代理角色一样
    • 动态代理类是动态生成的,不是我们直接写的
    • 动态代理也分为两大类:基于接口的动态代理,基于类的动态代理
      1. 基于接口:JDK 的动态代理
      2. 基于类:cglib
      3. java 字节码:Javassist

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

    • 可以使真实角色的操作更加纯粹,不用去关注公共业务
    • 公共业务交给代理角色,实现了业务的分工
    • 公共业务发生扩展时,方便集中管理
    • 一个动态代理类代理的是一个接口,一般是对应的一类业务
    • 一个动态代理类可以代理多个了

    相关文章

      网友评论

          本文标题:10 代理模式

          本文链接:https://www.haomeiwen.com/subject/rpktcrtx.html