• 静态代理模式


    一、地位

    代理模式,时SpringAOP的底层!【SpringAOP和SpringMVC】

    代理模式的分类:

    • 静态代理
    • 动态代理

    生活中的场景:
    在这里插入图片描述

    二、静态代理

    角色分析:

    • 抽象角色:一般会使用接口或者抽象类来解决
    • 真实角色:被代理的角色
    • 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
    • 客户:访问代理对象的人!

    案例:

    2.1、接口

    package com.massimo.demo;
    
    //租房
    public interface Rent {
    
        public void rent();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.2、真实角色

    package com.massimo.demo;
    
    //房东
    public class Host implements Rent{
        public void rent() {
            System.out.println("房东要出租房子!");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.3、代理角色

    package com.massimo.demo;
    
    public class Proxy implements Rent{
    
        private Host host;
    
        public Proxy() {
        }
    
        public Proxy(Host host) {
            this.host = host;
        }
    
        public void rent() {
            seeHouse();
            host.rent();
            signIn();
            fare();
        }
    
        //看房
        public void seeHouse(){
            System.out.println("中介带你看房");
        }
    
        //收中介费
        public void fare(){
            System.out.println("收中介费");
        }
    
        //签合同
        public void signIn(){
            System.out.println("签租赁合同");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    2.4、客户端访问代理角色

    package com.massimo.demo;
    
    public class Client {
        public static void main(String[] args) {
            //房东要租房子
            Host host = new Host();
            //代理,中介帮房东租房子,但是,代理角色,这里指中介,会有一些附属操作
            Proxy proxy = new Proxy(host);
            proxy.rent();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.5、测试

    在这里插入图片描述

    三、静态代理的利弊

    代理模式的好处:

    • 可以使真实角色的操作更加纯粹!不用去关注一 些公共的业务
    • 公共也就交给代理角色!实现了业务的分工!
    • 公共业务发生扩展的时候,方便集中管理!

    缺点:

    • 一个真实角色就会产生一个代理角色;代码量会翻倍,开发效率会变低~

    四、静态代理再理解

    现有如下项目:

    4.1、接口

    package com.massimo.demo2;
    
    public interface UserService {
        public void add();
        public void delete();
        public void update();
        public void query();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.2、真实对象

    package com.massimo.demo2;
    
    public class UserServiceImpl implements UserService {
        public void add() {
            System.out.println("增加了一个用户");
        }
    
        public void delete() {
            System.out.println("删除了一个用户");
        }
    
        public void update() {
            System.out.println("修改了一个用户");
        }
    
        public void query() {
            System.out.println("查询了一个用户");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.3、客户访问真实对象

    package com.massimo.demo2;
    
    public class Client {
        public static void main(String[] args) {
            UserServiceImpl userService = new UserServiceImpl();
    
            userService.add();
            userService.delete();
            userService.update();
            userService.query();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    效果:
    在这里插入图片描述

    4.4、问题:现在新增一个功能,要求在每一个方法执行之前,增加一个日志输出功能,输出要执行的操作!

    思想:在不改变原有代码的基础上,实现!

    4.4.1、代理类

    package com.massimo.demo2;
    
    public class UserServiceProxy implements UserService {
    
        private UserServiceImpl userService;
    
        public void setUserService(UserServiceImpl userService) {
            this.userService = userService;
        }
    
        public void add() {
            log("add");
            userService.add();
        }
    
        public void delete() {
            log("delete");
            userService.delete();
        }
    
        public void update() {
            log("update");
            userService.update();
        }
    
        public void query() {
            log("query");
            userService.query();
        }
    
        //日志方法
        public void log(String msg){
            System.out.println("使用了" + msg + "方法");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    4.4.2、客户访问真实对象

    package com.massimo.demo2;
    
    public class Client {
        public static void main(String[] args) {
            UserServiceImpl userService = new UserServiceImpl();
    
            UserServiceProxy proxy = new UserServiceProxy();
            proxy.setUserService(userService);
    
            proxy.add();
            proxy.delete();
            proxy.update();
            proxy.query();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    效果:
    在这里插入图片描述

  • 相关阅读:
    CentOS 7安装Redis5.0.7
    【Gopher 学个函数】边学边练,简单为 Go 上个分
    【设计模式】聊聊模板模式
    [SWPUCTF 2021 新生赛]easy_sql - 联合注入||报错注入||sqlmap
    完备的 AI 学习路线,最详细的资源整理!
    带大家来一次全志V853开发板沉浸式开箱
    Apipost一键压测参数化介绍
    串口数据接收
    hjr-如何做双十一 618 活动的备战工作
    windows系统删除网络适配器
  • 原文地址:https://blog.csdn.net/Massimo__JAVA/article/details/125404422