Java基础--代理模式(静态、动态)

本文通过购物等实例,介绍了静态代理和动态代理的概念及实现方式。静态代理适用于单一代理场景,而动态代理则能处理多种代理需求,有效降低系统耦合度。

自己对代理模式的一些理解,用白话通俗易懂的方式概括一下吧。
举个例子,现在有很多的海外代理,可以让他们代理鞋子,化妆品等等,毕竟现在都盲目的认为海外的都是好东西嘛!假设你需要买什么在海外的东西,你需要提前做一些准备的工作,比如调查这个产品的货源,或者分辨这个产品的真伪,买来之后,你也可以做一些关于这个产品的满意度调查,方便以后推荐给其他人来购买,但是你也可以找一个代理,让他来完成这些跟主要购买关系不大的事情,你只需要负责购买东西就好了。
一:静态代理模式
假设现在你需要购买化妆品,然后找到了海外的一些代理人,让他们帮你做一些提前的准备工作,你只需要告诉他们你要什么就可以了。
首先我们需要一个Subject类,用它来表示你需要让代理做什么,或者理解为做什么的代理人,比如购物,理财等等。
代理人和被代理人都是跟这个代理有关系的,所以他们通过Subject建立起关系,都要继承Subject接口
下面例子主要是让代理用来购物

package Test;
//主题
public interface Subject {

    public void shopping();
}

然后是一个代理类Proxy,来帮你做一些我们之前所提到的购物之前需要的准备工作。

package Test;
//代理人
public class Proxy implements Subject{
    private Subject target;//被代理人
    public Proxy(Subject target){
        this.target = target;
    }
    //实现接口的方法
    public void shopping(){
        //代理要做的事情 
        System.out.println("做大量的商品专业评估");

        target.shopping();//被代理人真正的业务


        //代购之后要做的事情
        System.out.println("满意度调查");
    }
}

上面的代理人是从主方法中传进来的,接着是被代理人SuperMan的代码:

package Test;
//被代理人
public class SuperMan implements Subject{
    public void shopping(){
        //买之前要做很多评估工作
        //。。。

        System.out.println("购买进口化妆品");


    }
}

然后是主方法:

package Test;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SuperMan man = new SuperMan();
        Proxy p = new Proxy(man);
        p.shopping();
    }

}

对象man传到代理类中,当作target来执行shopping()方法,这样调用的shopping方法就是SuperMan中的Shopping方法。
执行结果如下:
执行结果图

可能很多人会不明白为什么要这么做,或者认为也可以不需要什么代理类,这些工作一个类就可以完成,其实在一些小的程序中当作测试可以让一个类来完成,但是Java编程的思想就是接口化编程,还有一个就是降低耦合度,这个静态的代理模式耦合度是非常高的,因为一个被代理人就绑定了一个代理人,耦合度非常高,下面来说一下动态代理模式,用来降低耦合度,也是编程里面一个重要的思想,后面的Spring中也会使用动态代理的思想来实现代码。
二:动态代理模式
前面提到了静态代理的耦合度问题,假设现在我不仅仅是想要把购物的一些琐事交给代理,还想找理财代理,旅游代理,或者其他很多很多的代理,我应该怎么办?!如果现在有一个类似于代理机构存在,里面培养各个方面的代理人,我直接找到这个代理机构就好了,对吧,这就是动态代理实现的白话思想。
首先,我需要一个“代理机构”,用来生产代理的项目-购物和旅游:

package cn.park;

public interface ProxyMall {
    public void shopping();
    public void trival();
}

然后是代理类,这次的代理类需要继承InvocationHandler并且重写里面的方法:

package cn.park;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CreatProxy implements InvocationHandler{
    //声明被代理对象(之所以用Object是因为他在Java中是所有类包含自定义类的超类)
    private Object target;
    //创建代理对象(根据被代理对象需求)
    public Object bind(Object target){
        this.target = target;
        //使用Proxy类创建一个动态代理对象
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxy;
    }
    //具体执行业务的方法
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //调用业务方法
        method.invoke(target);
        return null;
    }
}

具体的参数为:
proxy: 代理类对象
method:被代理对象的方法,既下面的代理人中的旅游和购物
args:被代理对象方法的参数
被代理类Man:

package cn.park;

public class Man implements ProxyMall {

    @Override
    public void shopping() {
        System.out.println("我要买化妆品");
    }

    @Override
    public void trival() {
        System.out.println("我要旅游");
    }

}

在主方法中代码如下:

package cn.park;

public class Test {

    public static void main(String[] args) {
        Man man = new Man();
        CreatProxy cp = new CreatProxy();
        ProxyMall lj = (ProxyMall ) cp.bind(man);
        lj.shopping();
        lj.trival();
    }

}

在代理机构中,将多个代理人和被代理人绑定起来(通过CreatProxy类中的bind方法),代理人可以根据这个代理机构提供的代理类型(购物和旅游)来选择自己需要的代理(就是在Man中创建的方法)。

********************************************************
以上所有观点只是我个人的理解,不能保证全部的正确,也希望有更深更正确理解的朋友可以指出来我的错误,在此先谢过了!

内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值