Java之静态代理和动态代理模式

静态代理和动态代理模式

  1. 什么是代理模式?
    代理从字面意思来看就是,替代XX去做某事,在我们的程序中,一般替代实际对象去进行操作,扮演着中间人的角色:
客户端 –> 业务类 
客户端 –> 代理 –>业务类(代理)
  1. 什么是静态代理?
    特征是代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。
//里是静态代理的示例
//接口
interface NetWork {
    void brows();
}
//真实的服务器
class RealServer implements NetWork{
    @Override
    public void brows() {
        System.out.println("真实服务器的联网功能");
    }
}
//代理类
class ProxyServer implements NetWork{

    NetWork network;  //被代理类的对象来实例化

    public ProxyServer(NetWork network) {
        this.network = network;
    }

    @Override
    public void brows() {
        check();
        network.brows();
    }
    public void check(){
        System.out.println("代理服务器检查网络链接是否正常!");
    }
}
//主函数
public class StaticProxyInstance {


    public static void main(String arg[]) {

        NetWork network = new RealServer();
        ProxyServer proxy = new ProxyServer(network);
        proxy.brows();
    }
}

3.静态代理的不足

        缺点:
 *          不利于程序的拓展性
 *          同时每一个代理类只能有一个接口服务,
 *          如果好多类需要代理怎么办?

4.动态代理

Proxy :专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态地生成实现类。
提供用于创建动态代理类和动态代理对象的静态方法
static Class<?>   getProxyClass(ClassLoader loader, Class<?>... interfaces)  创建一个动态代理类所对应的Class对象

static Object   newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)  直接创建一个动态代理对象
//动态代理的例子
interface Human{
        abstract void info();
        abstract void fly();
}

//被代理类
class superMan implements Human{
    @Override
    public void info() {
        System.out.println("我是超人我怕谁");
    }

    @Override
    public void fly() {
        System.out.println("I believe I can fly!");
    }
}

//创建一个代理类

/**
 * 如何动态的的创建一个代理类的对象?
 * 有了代理类的对象如何执行被代理类的方法,不能暴露被代理类的东西?
 *
 */

class MyInvocationHandler implements InvocationHandler{

    Object obj;  //被代理类,先充当一下

    public MyInvocationHandler(Object obj) {
        this.obj = obj;
    }

    /**
     * 当我们通过代理类的对象调用接口中的方法时,就会转为如下的invoke()方法,去执行
     * 被代理类的方法
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object returnVal = method.invoke(obj, args);
        return returnVal;
    }

    public void bind(Object obj) {//对属性赋值
        this.obj = obj;

    }
}
class MyProxy{
    public static Object getProxyInstance(Object obj){ //被代理类的对象

        MyInvocationHandler handler = new MyInvocationHandler(obj);
        handler.bind(obj);


        //动态的返回一个代理类的对象
        //参数1:指明类的加载器
        //参数2:指明被代理类实现的接口
        //参数3:关联Handler
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass()
                .getInterfaces(),handler);
    }
}
public class ProxyInstance {

    public static void main(String arg[]) {
        superMan man = new superMan();
        Object objproxy = MyProxy.getProxyInstance(man);

        //是代理类的对象
        Human human = (Human) objproxy;


        //用代理类的对象调用方法
        human.fly();
        human.info();


    }


}
I believe I can fly!
我是超人我怕谁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值