您的位置:首页 > 编程语言 > Go语言

GOF设计模式-代理模式

2017-02-10 17:31 447 查看
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。



Subject:抽象主题类,声明真实主题与代理的共同接口方法。

RealSubject:真实主题类,定义了代理所表示的真实对象,客户端通过代理类间接的调用真实主题类的方法。

ProxySubject:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。

Client:客户端类。

来一个代理买车的例子

首先要有个买车的抽象类

public interface BuyCar {

public void getCar();

}


真实要买车的对象

public class My implements BuyCar{

@Override
public void getCar() {
System.out.println("我:我购买了一辆车");
}
}


代理,代替真实对象买车的,要持有真实对象的资料,不然就真成自己买车了

public class ProxyMy implements BuyCar{

private BuyCar buyCar; // 一定要持有真实对象

public ProxyMy(BuyCar buyCar) {
this.buyCar = buyCar;
}

@Override
public void getCar() {
System.out.println("代理:我是代购,我帮别人代购一辆车");
buyCar.getCar();
System.out.println("代理:代购完成,车辆已经交给客户");
}
}


来个测试类,测一下

public class Test {

public static void main(String[] args) {
BuyCar my = new My();
BuyCar buyCar = new ProxyMy(my);
buyCar.getCar();
}
}


代理模式,就是在代理类中持有一个真实类(被代理类)的对象,真正被调用的,还是真实类,就像上面,真实买车的,还是我,而实际买车的确实代理人,这样的话,代理人就可以在中间抽点利润什么的,我也免去了一些来回奔跑的麻烦。

动态代理

上面说的是静态代理,在代码运行前就已经存在了代理类的class编译文件,而动态代理则是在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。spring 的核心功能之一就是 aop,就是动态代理。

Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法。

创建动态代理类

public class DynamicProxy implements InvocationHandler {

private Object obj;

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

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理:我是代购,我帮别人代购一辆车");
Object result=method.invoke(obj, args);
System.out.println("代理:代购完成,车辆已经交给客户");
return result;
}
}


测试类:

public class Test {

/* public static void main(String[] args) {
BuyCar my = new My();
BuyCar buyCar = new ProxyMy(my);
buyCar.getCar();
}*/

public static void main(String[] args) {
BuyCar my = new My();
DynamicProxy dynamicProxy = new DynamicProxy(my);

ClassLoader classLoader = my.getClass().getClassLoader();
BuyCar buyCar = (BuyCar) Proxy.newProxyInstance(classLoader, new Class[]{BuyCar.class}, dynamicProxy);
buyCar.getCar();
}
}


代码地址:https://github.com/mazh1992/model/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式