设计模式——代理模式

代理模式是一种设计模式,用于在不修改原有类的基础上,通过代理类控制对真实对象的访问,以增强功能或保护对象。它有静态代理和动态代理两种形式。静态代理虽然高效,但每个被代理的类都需要对应的代理类,当代理类数量增加时,系统复杂度也随之提高。动态代理则通过JVM在运行时动态创建代理类,降低了系统耦合度,提高了扩展性。JDK代理主要涉及Proxy和InvocationHandler两个核心类,用于实现代理模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理模式
为其他对象提供一种代理以控制对这个对象的访问,有时委托类不适合或不能直接引用另一个对象时,代理类就在两方之间起到一个桥梁的作用。代理设计模式符合开闭原则 ,在不修改原有类的基础上,增强原有类的功能逻辑。
代理模式优点:
增强真实对象
保护真是对象
降低系统耦合度,扩展性好
代理模式缺点
代理类使系统设计时的类增多
静态代理: 一个接口,两个类:真实业务类,代理类
静态体现在:代理类和真实类的关系在程序运行前就确定了
在静态代理的实现中,需要定义一个接口,真实业务类和代理类都要实现这个接口,同时在代理类中,要定义一个真实对象的引用,通过构造方法传给代理类对象,然后在调用业务方法时,调用真实类的业务实现

//定义了业务的实现规范
interface Buy {
    void buyMac();
    void buyGivenchy();
}
//真实类(委托类)真实业务的实现
class Real implements Buy{

    @Override
    public void buyMac() {
        System.out.println("buy a mac");
    }

    @Override
    public void buyGivenchy() {
        System.out.println("buy a givenchy");
    }
}
//代理类  代理Real类搜集有的功能,并做额外的增强
class ProxyClass implements Buy{
//引用接口对象使得代理类可以访问实体
    private Buy buy;
    public ProxyClass(Buy buy){
        this.buy = buy;
    }
    //其实代理类的本质还是用了委托类的具体方法
    @Override
    public void buyMac() {
        System.out.println("买");
        this.buy.buyMac();
    }

    @Override
    public void buyGivenchy() {
        System.out.println("买");
        this.buy.buyGivenchy();
    }
}
public class ProxyDemo {
    public static void main(String[] args) {
        Buy buy = new ProxyClass(new Real());
        buy.buyMac();
        buy.buyGivenchy();
    }
}

静态代理是效率最高效率的代理模式,但它也存在缺陷
**静态代理缺陷:**每一个需要被代理的类或接口,都要为其实现一个代理类,如果需要代理的类或接口很多,就导致要实现的代理类也很多,这时引入动态代理。动态代理是由一个代理类来代理所有需要被代理的类或接口
动态代理:
在程序运行时有JVM创建代理类,此时的这个代理类可以代理任何需要被代理的类或接口,动态体现在这里
今天来说JDK代理:
JDK代理就是使用JDK内置的方法去实现代理模式,有两个核心的类Proxy和InvocationHandle
Proxy:调度器
InvocationHandle:增强器

public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException

有三个参数:
真是对象的类加载器
真是对象实现的接口
真实对象实例
实现动态代理:

interface ISubject{
    public void eat(int num,String msg);
}
//真是业务类
class RealImpl implements ISubject{

    @Override
    public void eat(int num,String msg) {
        System.out.println("I want to buy "+ num + msg);
    }
}
//实现InvocationHandler的代理类
class ProxySubject implements InvocationHandler{
    private Object target;

    public ProxySubject(){ }

    public Object bind(Object target){
        this.target = target;
        //通过JDK获取代理类对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);//此时的this是真实类的对象
    }

    public void preHandle(){
        System.out.println("before buy");
    }

    public void afterHandle() {
        System.out.println("after buy");
    }
//通过invoke方法对真是业务做增强以及调用真实业务
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.preHandle();
        Object obj = method.invoke(this.target,args);
        this.afterHandle();
        return obj;
    }
}
public class JDKProxyDemo {
    public static void main(String[] args) {

        ISubject subject = (ISubject) new ProxySubject().bind(new RealImpl());
//此时真实类与代理已经建立联系
        subject.eat(3,"apples");
    }
}

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值