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中创建的方法)。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值