常见的设计模式 ----- 代理模式
2014-03-12 22:25
344 查看
代理模式
为其他对象提供一种代理以控制对这个对象的访问。
举个例子,大家买火车票的时候,可以去火车站买,我们都知道,火车站的人很多,买票需要排队。
如果不想排队,可以去代理点儿那儿买。
代理就是这个意思,代我们去买火车票哈!
代理分为静态代理和动态代理,下面分别举例说明。
静态代理:
票务系统接口:
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 }
这个就是代理,同样实现了票务系统的接口
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 }测试:
我们买票的时候就可以不去火车站了,到路边的代理点可以更高效的买到车票,虽然有手续费,但性价比高呀,用钱来买排队的时间哈。
public class ProxyTest {
public static void main(String[] args) {
TicketsProxy proxy = new TicketsProxy();
proxy.buyTicket();
}
}
动态代理:
只对上面的TicketsProxy进行修改
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 }测试:
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 }
为其他对象提供一种代理以控制对这个对象的访问。
举个例子,大家买火车票的时候,可以去火车站买,我们都知道,火车站的人很多,买票需要排队。
如果不想排队,可以去代理点儿那儿买。
代理就是这个意思,代我们去买火车票哈!
代理分为静态代理和动态代理,下面分别举例说明。
静态代理:
票务系统接口:
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 }
这个就是代理,同样实现了票务系统的接口
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 }测试:
我们买票的时候就可以不去火车站了,到路边的代理点可以更高效的买到车票,虽然有手续费,但性价比高呀,用钱来买排队的时间哈。
public class ProxyTest {
public static void main(String[] args) {
TicketsProxy proxy = new TicketsProxy();
proxy.buyTicket();
}
}
动态代理:
只对上面的TicketsProxy进行修改
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 }测试:
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 }
相关文章推荐
- 4.偏头痛杨的常见设计模式入门系列之代理模式篇
- Java中常见的设计模式之代理设计模式
- 诸多设计模式中,最为常见的三种设计模式-单例模式,代理模式,工厂模式
- 9.3.4: 常见设计模式精讲---代理模式
- Android 进阶之路:常见设计模式之代理模式二
- Java常见设计模式之代理模式
- 设计模式C++实现:代理模式
- 设计模式之结构型模式―― 2.7 代理模式
- Net设计模式实例之代理模式(Proxy Pattern)
- java设计模式之代理模式,java动态代理
- java设计模式之代理模式
- Java设计模式之代理模式(动态代理)
- Javascript常见设计模式解析
- iOS设计模式 - 代理设计模式(Delegate)
- 设计模式(二十九)------23种设计模式(21):代理模式
- 学习设计模式之禅——代理模式
- 设计模式学习——动态代理实现C#动态调用WebService(附源码)
- Java设计模式----1.代理模式
- 初识PHP设计模式--代理模式
- 结构型设计模式之代理模式