代理模式的定义是:给某一个对象提供一个代理,并有代理对象控制对原对象的应用
代理模式包含 如下角色:
ISubject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口
RealSubject:真实的主题角色,是实现抽象主题接口的类
Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
静态代理:
代理模式有几种,虚拟代理,计数代理,动态代理。主要分为两类,静态代理和动态代理。静态代理比较简单,有程序员编写的代理类,并在程序运行前就编译好的,而不是有程序动态产生的。
方式1:聚合式静态代理
public interface Manager{
void doSomething();
}
2.真实主题类
public class Admin implements Manager{
void domSomething(){
sysout("Admin do somethis);
}
}
3.以聚合式实现的代理主题
public class AdminPoly implements Manager{
private Admin admin;
public AdminPoly(Admin admin){
super();
this.admin=admin;
}
void doSomething(){
syout(Log);
}
}
动态代理
一般来说,对代理模式而言,一个主题类与一个代理类一一对应,这也是静态代理模式的特点
但是,也存在这样的情况,有n个主题类,但是代理类中的“前处理、后处理”都是一样的,仅调用主题不同。多个主题类对应一个代理类,共享“前处理,后处理”功能,动态调用所需主题,大大减少了程序规模,就是动态代理的特点。
JDK动态代理:
1.抽象的主题
public interface Moveable{
void move() throws Exception;
}
2.真实主题
public class Car implements Moveable{
public void move() throws Exception{
Thread.sleep();
sysout("汽车行驶中“”);
}
}
3.事务处理器TimeHandler implements InvocationHandler{
private Object targetr;
public TImehandler(object target){
super();
this.target=target;
}
public Object invoke(Object proxy,Method,Object[] args){
long startTime=system.CurrentTimeMills();
Systemout.println("汽车开始行驶“);
method.invoke(target,args);
}
}
测试类:
Car car=new Car();
InvocationHandler H=new TimeHandler(car);
class<?> cls=car.getclass();
Moveable m=(moveable)Proxy.newProxyInstance(clas.getclassloader,clas.getInterfaces,h);
h.move();