设计模式之代理模式

什么是代理模式?

有一天,你的妹子需要一个包,为了哄妹子开心,你决定给她买个好一点的包,但是大家都知道,国内的都那么贵,那就去国外或者香港买。最近你又特别忙,没有时间出去,这个时候某个同事有刚好要出去,那你就让他帮忙喽。那么,这整个过程就是一个代理模式了!

这个里面,同事就是代理对象,你就是真实对象,买包就是公共的方法了,为了更好的实现分离,我们还会定义一个接口,定义公共的方法,以减小程序的耦合。代理模式的结构如下:

 

代理模式的实现

1、创建抽象对象的接口

public interface Sub {
	public void buy();
}

2、创建真实对象

public class RealSub implements Sub{	
	public void buy(){
		System.out.println("买一个包!");
	}
}

3、创建代理对象类

public class ProxySub implements Sub{
	public void buy(){
		RealSub realsub = new RealSub();
	    realsub.buy();
	    this.need();
	}
	public void need(){
		System.out.println("拿一个channel的包!");
	}
}

4、客户端调用

 

public class ProxyTest {
	public static void main(String[] args){
		Sub proxysub = new ProxySub();
		proxysub.buy();
	}
}

 

运行结果:

为什么需要代理模式?

 

明明很简单的一个功能,为什么分成这么多来写,完全是增加程序的复杂性啊!但是如果我们的代码量增大,处理的事物逻辑变得复杂,这个时候代理模式能给我们带来很大的方便。它能够让职责更加的清晰,而且具有高拓展性,降低程序的耦合度。

 动态代理

静态代理:代理类是在编译时就实现好的。也就是说Java编译完成后,代理类是一个实际的class文件。

动态代理:代理类是在运行时生成的。也就是说Java编译完成后并没有实际的class文件,而是在运行时动态生成的类字节码,并加载到JVM中。

 动态代理实现代码

 

import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {
	public static void main(String[] args){
		RealSubject realSubject = new RealSubject();
		ProxyHandler handler = new ProxyHandler(realSubject);
		Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
                               RealSubject.class.getInterfaces(), handler);
		proxySubject.request();
	}
}

interface Subject{
	void request();
}

class RealSubject implements Subject{
	public void request(){
		System.out.println("======realSubject Request!=======");
	}
}

class ProxyHandler implements InvocationHandler{
	private Subject subject;
	public ProxyHandler(Subject subject){
		this.subject = subject;
	}
	
	public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
		System.out.println("========before=======");
		Object result = method.invoke(subject, args);
		System.out.println("======after==========");
		return result;
	}
}

 

运行结果如上图所示,本文只是简单的让我们对动态代理有一个观感,具体的实现机制,需要另外的专门文章来进行讲解。

总结

代理模式相对来说比较的简单,主要有三个角色:接口、代理对象、真实(委托)对象。在Android的binder通信机制当中就用到代理模式,虽然代理模式有一些优点,但是还有存在一些缺点的,不然就没有其他那些设计模式了。由于在中间增加了一个代理对象,导致有的时候访问的处理请求的速度会变慢,并且代理模式需要额外的工作,会增加实现的复杂度。所以,没有最好的设计模式,只有最合适的设计模式!

参考博客:

https://www.jianshu.com/p/6f6bb2f0ece9

https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/

http://www.runoob.com/design-pattern/proxy-pattern.html

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值