08【代理设计模式】_代理设计模式类图

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以联系领取~

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

2️⃣视频配套工具&国内外网安书籍、文档
① 工具

② 视频

image1

③ 书籍

image2

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

+ - [8.2.1 代理设计模式概述](#821__19)
	- [8.2.2 代理设计模式的UML类图](#822_UML_37)
+ [8.3 代理设计模式的实现](#83__48)
+ - [8.3.1 静态代理和动态代理简介](#831__50)
	- [8.3.2 静态代理的实现](#832__63)
	- [8.3.3 动态代理的实现](#833__174)
	- * [1)JDK动态代理](#1JDK_180)
		* [2)CGLIB代理](#2CGLIB_271)
	- [8.3.4 JDK代理和GBLIB代理的区别](#834_JDKGBLIB_343)
+ [8.4 代理设计模式优缺点](#84__354)

八、代理设计模式

8.1 结构型设计模式简介

结构型模式(Structural Pattern)关注类和对象的组合。其描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。

结构型模式可以分为类结构型模式和对象结构型模式:

  • 1)类结构型模式:类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承和实现关系。
  • 2)对象结构型模式:对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。

由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性,因此大部分结构型模式都是对象结构型模式。

8.2 代理设计模式简介

8.2.1 代理设计模式概述

代理设计模式(Proxy Pattern):指为其他对象提供一种代理,以控制这个对象的访问;

由于某种原因,一个对象不能够直接引用另一个对象时,代理对象可起到一个中介作用。即用代理对象来调用目标对象(被代理对象,资源的真实拥有者),并且代理对象也可以在目标对象的实现基础上进行增强,另外代理对象可以控制目标对象的访问,进行安全控制

Tips:代理模式主要的功能就是对类进行增强,并且对目标对象进行安全控制;

生活中的代理有很多场景:

调用者(客户端)代理角色真实角色(目标对象)
买电脑的人电脑代理商生产电脑的厂商
买火车票黄牛火车站,12306
租房子房子中介房东

我们发现代理角色真实角色都具有相同的功能(卖电脑/卖票),代理商可以在中间赚取差价(修改原有的功能)。

8.2.2 代理设计模式的UML类图

代理设计模式中一般包含3个角色:

  • 1)抽象主题(Subject):用于规范真实角色和代理角色拥有共同的业务方法;
  • 2)真实主题(RealSubject):实现了抽象主题中的具体业务,提供业务的和兴功能;也叫目标对象
  • 3)代理主题(Proxy):实现了真实主题所实现的所有接口,确保与真实主题拥有同样的方法,即保证真实主题的所有方法都能代理到,器内部含有真实主题的引用,可以调用真实主题的核心方法;可以在调用真实主题的方法前后进行功能的增强,也可以进行真实主题的方法访问控制;

在这里插入图片描述

8.3 代理设计模式的实现

8.3.1 静态代理和动态代理简介

代理模式分为静态代理动态代理

  • 静态代理:静态代理类在编译期就生成,在不修改源代码的情况下,静态代理类是不会发生改变的,当真实对象扩展了一个方法时,必须要手动的修改静态代理类来确保能够代理到真实对象最新的方法;
  • 动态代理:动态代理类是在Java运行时动态生成的,当真实对象扩展任意方法时,动态代理类也会自动的扩展方法,不需要我们修改源代码;在Java中,动态代理分为JDK动态代理和CGLIB动态代理;

【案例】设计一套租房程序:

如果我们要去租房,需要去找房东,但是房东很可能不在家,但是房东会把房子交给中介,我们可以去中介寻找合适的房源;这就是一个典型的代理模式,目标对象是房东,房子是在房东手里的,中介是代理对象,对目标对象进行增强(我们在中介手里租的房子肯定比房东收的价格要贵);

8.3.2 静态代理的实现
  • 抽象主题:
package com.pattern.demo01;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 抽象主题
 \*/
public interface IHouse {
    // 海景房
    void seaViewRoom();

    // 江景房
    void riverViewRoom();
}

  • 真实主题(房东,资源的真实拥有者):
package com.pattern.demo01;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 房东,房子的实际拥有者(真实对象也叫目标对象)
 \*/
public class HouseOwner implements IHouse{
    @Override
    public void seaViewRoom() {
        System.out.println("海景房...");
    }

    @Override
    public void riverViewRoom() {
        System.out.println("江景房...");
    }
}

  • 代理主题(中介):
package com.pattern.demo01;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 房子的代理商(中介)
 \*/
public class HouseProxy implements IHouse {

    // 拥有房东的引用(资源不在代理对象这里,而是通过真实对象获取到真实资源)
    private HouseOwner houseOwner;

    public HouseProxy(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    @Override
    public void seaViewRoom() {

        System.out.println("多收1000元");

        // 调用真实资源
        houseOwner.seaViewRoom();

        System.out.println("豪华级服务...");
    }

    @Override
    public void riverViewRoom() {

        System.out.println("多收500元");
        houseOwner.riverViewRoom();
        System.out.println("贵宾级服务...");
    }
}

  • 测试代码:
package com.pattern.demo01;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class Demo01\_静态代理 {
    public static void main(String[] args) {
        // 创建一个代理对象
        IHouse house=new HouseProxy(new HouseOwner());

        house.riverViewRoom();
        System.out.println("-------------------");
        house.seaViewRoom();
    }
}

运行效果:

在这里插入图片描述

8.3.3 动态代理的实现

在静态代理中,房东如果新增了新的房源,如果中介要代理心得房源则必须修改源代码,这样一来程序的耦合性高,为了降低耦合,我们提供了动态代理的概念;

动态代理:即代理类在Java运行时生成,并不需要我们自己编写,当我们对目标对象新增或减少方法时,代理对象会自动的增加或减少;Java中实现动态代理有两种方式,分别是JDK提供的动态代理以及Spring框架提供的CGLIB代理;

1)JDK动态代理

JDK动态代理主要是Proxy类来完成的。

  • Proxy类:
public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 作用:生成一个代理对象
loader和目标对象一类的类加载器
interfaces目标对象所有实现的接口的字节码对象
h是一个接口,传一个匿名内部类做为实现类,并且重写其中的方法来实现代理的功能
返回值返回代理对象
  • InvocationHandler接口
Object invoke(Object proxy, Method method, Object[] args) 作用:这个接口中的方法会调用多次,每个方法都会调用一次,用来实现代理方法的功能
proxy代表生成的代理对象,不建议在方法中直接调用,不然会出现递归调用。
method目标对象的方法对象
args调用方法时传递的参数数组
返回值返回当前这个方法调用的返回值
  • 示例代码:
package com.pattern.demo01;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class Demo02\_动态代理 {
    public static void main(String[] args) {

        // 与目标对象一类的类加载器
        ClassLoader appClassLoader = HouseOwner.class.getClassLoader();

        // 目标对象实现的所有接口的字节码对象
        Class<?>[] targetInterfaces = HouseOwner.class.getInterfaces();

        // 调度对象,当代理对象执行方法时,会执行调度对象中的invoke方法
        InvocationHandler handler = new InvocationHandler() {
            /\*\*
 \*
 \* @param proxy: 代理对象
 \* @param method:
 \* @param args
 \* @return
 \* @throws Throwable
 \*/
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                String methodName = method.getName();

                System.out.println("执行的方法是: " + methodName);

                // 执行目标方法(必须传递目标对象来执行),返回目标方法的返回值
                Object returnVal = method.invoke(new HouseOwner(), args);

                return returnVal;
            }
        };

        IHouse proxy = (IHouse) Proxy.newProxyInstance(
                appClassLoader,
                targetInterfaces,
                handler
        );

        proxy.riverViewRoom();
    }
}


**在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**


需要完整版PDF学习资源

**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值