代理模式(三)
来源:互联网 发布:linux怎么创建目录 编辑:程序博客网 时间:2024/05/21 16:55
静态代理:聚合+继承
聚合 :在一个类中调用另一个对象,把参数传进来,执行器业务逻辑
聚合比继承更适合代理模式
实现功能特价,增加日志处理,增加权限管理、在move方法外层添加方法实现运行时间处理功能、实体对
像方法move
如果用继承方式实现功能叠加,代理类将无限叠加下去。
package proxy;
public interface Moveable {
public void move();
}
package proxy;
import java.util.Random;
public class Car implements Moveable{
@Override
public void move() {
//实现开车
try {
Thread. sleep(new Random().nextInt(1000));
System. out.println( “汽车行驶中。。。。。” );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package proxy;
public class CarLogProxy implements Moveable{
private Moveable m;
public CarLogProxy(Moveable m){
super();
this. m = m;
}
@Override
public void move() {
System. out.println( “日志开始”);
m.move();
System. out.println( “日志结束”);
}
}
package proxy;
public class CarTimeProxy implements Moveable{
private Moveable m;
public CarTimeProxy(Moveable m){
super();
this. m = m;
}
@Override
public void move() {
long starttime =System. currentTimeMillis();
System. out.println( “汽车开始行使” );
m.move();
long endtime = System. currentTimeMillis();
System. out.println( “汽车结束行驶..汽车行驶时间:” +(endtime -starttime ));
}
}
package proxy;
public class Client {
public static void main(String[] args) {
/*Car car = new Car();
car.move();*/
//使用继承的方式
/*Moveable car = new Car2();
car.move();*/
//使用聚合方式实现 /*Car car = new Car(); Moveable n = new CarTimeProxy(car); n.move();*/ Car car = new Car(); CarTimeProxy ctp = new CarTimeProxy( car); CarLogProxy clp = new CarLogProxy( ctp); clp.move(); }
}
JDK动态代理
Java 动态代理类位于java.lang.reflect报下,一般主要涉及到以下两个类:
(1)Interface InvocationHandler:该接口中仅定义了一个方法
public object invoke(Object obj,Method method,Object[] args)
在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数 组 。这个抽象方法在代理类中动态实现。
(2)Proxy:该类纪委动态代理类
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类的一个实例,返回后的大力类可以当做代理类使用(可使用被代理类的在接口中声明过的方法)
代理模式-动态代理
所谓Dynamic Proxy是这样一种class;
它是在运行时生成的class
该class需要实现一组interface
使用动态代理类时,必须实现InvocationHandler接口
package JdkProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TimeHandler implements InvocationHandler{
public TimeHandler(Object target) {
super();
this.target = target;
}
private Object target;
/*
* (non-Javadoc)
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
* 参数:
* proxy:被代理对象
* method:被代理对象的方法
* args:方法的参数
* 返回值: Object 方法的返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
long starttime =System.currentTimeMillis();
System.out.println(“汽车开始行使”);
method.invoke(target);
long endtime = System.currentTimeMillis();
System.out.println(“汽车结束行驶..汽车行驶时间:”+(endtime-starttime));
return null;
}
}
package JdkProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import proxy.Car;
import proxy.Moveable;
public class Test {
/**
* JDK动态代理测试类
* @param args
*/
public static void main(String[] args) {
Car car = new Car();
InvocationHandler h = new TimeHandler(car);
Class
- 代理模式(三)
- 代理模式(三):远程代理,虚拟代理,缓冲代理
- 代理模式(三):远程代理,虚拟代理,缓冲代理
- 代理模式(三):远程代理,虚拟代理,缓冲代理
- 代理模式三(cglib动态代理)
- 设计模式(三) ----代理模式
- (结构型模式三)代理模式
- 设计模式(三)--代理模式
- java设计模式--代理模式(三)
- AOP之代理模式(三)
- 设计模式(三)动态代理
- 三种代理模式
- 设计模式三 代理模式
- 三.设计模式-代理模式
- 设计模式<三>代理模式
- C#设计模式之代理模式(三)
- 设计模式实践(三)代理模式(Proxy)
- 设计模式学习笔记(三)动态代理模式
- 领域驱动设计实现之路
- HTML5——新增表单元素与属性(2)
- KMP初学
- git 使用详解(5)-- get log 查看提交历史
- 开发中注意下面几点:
- 代理模式(三)
- 多个storyboard实现tabbar
- C# 和Java区别
- 驱动开发(12)内核中的多线程和同步对象
- HTML5——新增表单元素与属性(3)
- git 使用详解(6)-撤消操作
- 线程监听文件小程序
- 集群、分布式、负载均衡区别与联系
- ABSTRACT FACTORY抽象工厂 - 对象创建型模式(四)