给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
在代理模式中,代理对象和目标对象需要实现同一个接口。
IPerson.interface
package proxy;
public interface IPerson {
public void say();
}
若没有代理,每个目标对象方法里都要写记录日志的代码,是代码冗余。如下
public class Man implements IPerson {
@Override
public void say() {
long begin = System.currentTimeMillis();
System.out.println("男人赚钱养家");
long end = System.currentTimeMillis();
System.out.println(end-begin);
}
}
若采用静态代理:
静态代理发生在编译期间。收到创建的。在编译时就已经将接口,被代理类,代理类等确定下来。代理类和代理对象都要实现同一个接口,同时,代理对象要操控目标对象。
缺点:接口和代理类是一对一的,有多个接口代理,就需要多个代理类,繁琐,类爆炸。
Man.class
package proxy;
public class Man implements IPerson {
@Override
public void say() {
System.out.println("男人赚钱养家");
}
}
PersonProxy.class
package proxy;
public class PersonProxy implements IPerson{
IPerson person;
public PersonProxy(IPerson person){ //把目标对象person传入
this.person=person; //生成本类的person对象
}
@Override
public void say() {
long begin = System.currentTimeMillis();
person.say(); //引用目标对象调用目标对象的方法
long end = System.currentTimeMillis();
System.out.println(end-begin);
}
}
ProxTest.class
package proxy;
public class ProxTest {
public static void main(String[] args) {
Man man = new Man();
Women women = new Women();
OldMan oldMan = new OldMan();
PersonProxy manProxy = new PersonProxy(man); //生成多个代理类对象,为不同的目标对象服务
PersonProxy womanProxy = new PersonProxy(women);
PersonProxy oldManProxy = new PersonProxy(oldMan);
manProxy.say();
womanProxy.say();
oldManProxy.say();
/* 运行结果: 男人赚钱养家
0
买衣购物
0
干农活
0*/
}
}