首页 > 其他 > 详细

常见的设计模式 ----- 代理模式

时间:2014-03-13 13:53:45      阅读:342      评论:0      收藏:0      [点我收藏+]

代理模式

 为其他对象提供一种代理以控制对这个对象的访问。

举个例子,大家买火车票的时候,可以去火车站买,我们都知道,火车站的人很多,买票需要排队。

如果不想排队,可以去代理点儿那儿买。

代理就是这个意思,代我们去买火车票哈!

 

代理分为静态代理和动态代理,下面分别举例说明。

 

静态代理:

票务系统接口:

1 public interface TiketsSystem {
2     void buyTicket();
3 }

 

火车站实现了这个票务系统的接口,可以买票:

1 public class TrainStation implements TiketsSystem{
2     public void buyTicket(){
3         System.out.println("buy a ticket");
4     }

 

这个就是代理,同样实现了票务系统的接口

bubuko.com,布布扣
 1 public class TicketsProxy implements TiketsSystem{
 2     TiketsSystem proxy;
 3     TicketsProxy(){}
 4     @Override
 5     public void buyTicket() {
 6         if (proxy == null) {
 7             proxy = new TrainStation();
 8         }
 9         proxy.buyTicket();
10     }
11 }
bubuko.com,布布扣

测试:

我们买票的时候就可以不去火车站了,到路边的代理点可以更高效的买到车票,虽然有手续费,但性价比高呀,用钱来买排队的时间哈。

public class ProxyTest {
    public static void main(String[] args) {
        TicketsProxy proxy = new TicketsProxy();
        proxy.buyTicket();
    }
}

 

动态代理:

只对上面的TicketsProxy进行修改

bubuko.com,布布扣
 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 
 5 public class TicketsProxy implements InvocationHandler{
 6     private Object proxy;
 7     
 8     // 返回TrainStation的实例来作为代理
 9     public Object getProxy (Object p) {
10         proxy = p;
11         return Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.getClass().getInterfaces(), this);
12     }
13     
14     // InvocationHandler接口定义的方法
15     @Override
16     public Object invoke(Object proxy, Method method, Object[] args)
17             throws Throwable {
18         // 通过反射调用TrainStation的buyTicket方法
19         Object obj = method.invoke(this.proxy, args);
20         return obj;
21     }
22     
23 }
bubuko.com,布布扣

测试:

bubuko.com,布布扣
1 public class ProxyTest {
2     public static void main(String[] args) {
3         // 通过getProxy方法获得火车站买票的代理权
4         TiketsSystem proxy = (TiketsSystem)new TicketsProxy().getProxy(new TrainStation());
5         // 代理来买票
6         proxy.buyTicket();
7     }
8 }
bubuko.com,布布扣

常见的设计模式 ----- 代理模式,布布扣,bubuko.com

常见的设计模式 ----- 代理模式

原文:http://www.cnblogs.com/keyiei/p/3597467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!