java设计模式之五:代理模式

来源:互联网 发布:淘宝图片空间一键删除 编辑:程序博客网 时间:2024/05/22 14:13

代理模式顾名思义:一个人代替一个人去干一些事,比如说大家熟知的武林外传中就有小六替秀才表白的情节,但是除了替秀才表白,还能在这上面进行一些扩展。接下来我们来了解下代理模式吧。

代理模式一般分为静态代理模式和动态代理模式。静态代理如果需要在接口中添加方法,你就必须进行大批量的修改,所以这不太适合需要经常修改需求的场景。而动态代理模式则是利用了Java的反射机制实现的一种。

静态代理模式:

第一步:因为代理一般都是行为,所以创建的是接口而不是抽象类。

第二步:创建目标对象(也就是被代理对象)实现接口;同样创建代理对象实现接口,紧接着在构造函数中实现目标对象引用的赋值。

第三步:在客户端实现测验。

public interface ProxyInterface {public void login();public void regist();public void exit();}
public class Goal implements ProxyInterface{@Overridepublic void login() {System.out.println("正在登录");}@Overridepublic void regist() {System.out.println("正在注册");}@Overridepublic void exit() {System.out.println("正在推出");}  }
public class StaticProxy implements ProxyInterface{private ProxyInterface goal;  //这里是抽象的,从而让代理类和委托类彼此不熟悉,只有第三方了解,也就是客户端public StaticProxy(ProxyInterface goal){this.goal=goal;}@Overridepublic void login() {goal.login();           //代替目标进行登录}@Overridepublic void regist() {goal.regist();         //代替目标进行注册}@Overridepublic void exit() {goal.exit();}}
public void test() {StaticProxy proxy=new StaticProxy(new Goal());proxy.login();proxy.regist();}

这样就完成了代理类实现被代理类的功能,还能在这上面进行方法的扩展。


动态代理

通过依靠代理类:.Java.lang.reflect.Proxy 

public class Dynamicproxy implements InvocationHandler{private ProxyInterface goal;public Dynamicproxy(ProxyInterface goal) {this.goal=goal;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("预处理");method.invoke(goal, args);System.out.println("后续处理任务");return null;}}
public void test1() {Goal goal=new Goal();        Dynamicproxy dynamicproxy=new Dynamicproxy(goal);        //生成代理类对象        ProxyInterface proxy=(ProxyInterface) Proxy.newProxyInstance        (ClassLoader.getSystemClassLoader(), new Class[]{ProxyInterface.class},dynamicproxy);        proxy.login();        proxy.exit();}
这样在接口中添加或者修改接口中的方法后,不需要再去代理类和被代理类中修改了。

缺点:不能在各自的方法中实现各自的扩展。就像上面,所有的方法调用前后都会输出“预处理”和“后序处理任务”


 



原创粉丝点击