首页 > 代码库 > Java-设计模式之代理模式
Java-设计模式之代理模式
1.什么是代理模式?
代理模式就是为其他对象提供一种代理,以控制对这个对象的访问。例如我们在购买火车票的时候,在有些地方有火车票的代售点,这些代售点可以帮助火车站来实行购票的功能,像这种模式就是代理模式。在Java中,代理模式启动中介的作用,可以去掉功能服务或者增加额外的服务。
2.代码模式的分类
A、远程代理:为不同地理的对象提供局域网代表对象,相似于客户端和服务器一样的模式。
B、虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建。例如,在我们浏览网页的时候,有时候需要加载很大的图片,在图片为加载成功之前,我们可以使用一张临时的图片来暂时的显示。
C、保护代理:就是控制一个对象的访问权限。例如,我们在浏览帖子的时候的时候,当我们还没有注册时候,只能进行浏览的功能,当我们注册过后就可以进行发帖的功能。
D、智能引用代理:就是给目标对象提供额外的服务。相当于就是给代理增加了一些功能或者服务。
3.代理模式的实现方式
主要有两种实现方式:一是静态代理,二是动态代理
A、静态代理:
代理和被代理对象在代理之前是确定的。他们都实现了相同的接口或者继承了相同的抽象类。
通过继承来实现代理模式:
1 package com.example.DesignPattern.ProxyPattern; 2 3 public interface MoveAble { 4 public void move(); 5 }
1 package com.example.DesignPattern.ProxyPattern; 2 3 import java.util.Random; 4 5 public class Car implements MoveAble{ 6 7 @Override 8 public void move() { 9 try { 10 System.out.println("汽车行驶中..."); 11 Thread.sleep(new Random().nextInt(1000)); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } 15 } 16 17 }
1 package com.example.DesignPattern.ProxyPattern; 2 3 public class Car1 extends Car { 4 @Override 5 public void move() { 6 long startTime = System.currentTimeMillis(); 7 System.out.println("汽车开始行驶..."); 8 super.move(); 9 long endTime = System.currentTimeMillis(); 10 System.out.println("汽车结束行驶..行驶时间:" + (endTime - startTime) + "毫秒"); 11 } 12 }
通过聚合的方式来实现代理模式:
1 package com.example.DesignPattern.ProxyPattern; 2 3 4 5 public class Car2 implements MoveAble{ 6 private Car mCar = null; 7 public Car2(Car car) 8 { 9 mCar = car; 10 } 11 @Override 12 public void move() { 13 long startTime = System.currentTimeMillis(); 14 System.out.println("汽车开始行驶..."); 15 mCar.move(); 16 long endTime = System.currentTimeMillis(); 17 System.out.println("汽车结束行驶..行驶时间:" + (endTime - startTime) + "毫秒"); 18 } 19 20 }
B.使用JDK动态代理:
1 package com.example.DesignPattern.AgentPattern; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class TimeHandler implements InvocationHandler{ 7 private Object target = null; 8 public TimeHandler(Object target) 9 { 10 this.target = target; 11 } 12 /** 13 * proxy:被代理的对象 14 * method:被代理对象的方法 15 * args:代理方法的对象 16 * 17 * 返回值:代理的方法的返回值 18 */ 19 @Override 20 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 21 method.invoke(target); 22 return null; 23 } 24 25 }
1 package com.example.DesignPattern.AgentPattern; 2 3 import java.lang.reflect.Proxy; 4 5 import com.example.DesignPattern.ProxyPattern.Car; 6 import com.example.DesignPattern.ProxyPattern.MoveAble; 7 8 public class Test { 9 public static void main(String[] args) { 10 Car car = new Car(); 11 TimeHandler handler = new TimeHandler(car); 12 Class<?> cls = car.getClass(); 13 /** 14 * 第一个参数:被代理类的类加载器 15 * 第二个参数:被代理类实现接口 16 * 第三个参数:InvocationHandler对象,需要我们手动创建一个子类,来实现功能 17 */ 18 MoveAble m = (MoveAble) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), handler); 19 m.move(); 20 } 21 }
JDK动态代理的实现步骤:
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法。
2.创建被代理的类以及接口
3.调用Proxy的静态方法,创建一个代理类:newProxyInstance(ClassLoader load, Class []intefeaces, InvolcationHandler h);
4.通过代理调用方法
Java-设计模式之代理模式