一、静态代理
1、定义
我们什么时候会用到代理模式呢?主要是在测试时,例如测试时间和打印日志等情况。
2、角色
角色主要有接口、被代理者、代理类。其关系如下图,我们发现,被代理的具体实现类和代理抽象类都会实现一个统一的接口
3、优缺点
1)优点
1、降低耦合度,客户端只需要与代理类打交道,而不需要知道被代理者有什么属性有什么方法。
2、
4、应用背景
5、代码实现
//接口
package pattern.proxy.version1;
public interface Runnable {
void run();
}
//具体被代理实现类(系统A、系统B)
package pattern.proxy.version1;
import java.util.Random;
public class SystemA implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(new Random().nextInt(8888));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("SystemA was carried out!");
}
}
package pattern.proxy.version1;
import java.util.Random;
public class SystemB implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(new Random().nextInt(8888));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("System B was carried out");
}
}
//抽象代理类
package pattern.proxy.version1;
public abstract class AbstractProxy implements Runnable{
Runnable system;
public AbstractProxy(Runnable system) {
this.system=system;
}
public abstract void run();
}
//具体代理类Time代理和Log代理
package pattern.proxy.version1;
public class TimeProxy extends AbstractProxy{
public TimeProxy(Runnable system) {
super(system);
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated method stub
long start=System.currentTimeMillis();
system.run();//可以直接用父类的属性
long end=System.currentTimeMillis();
System.out.println("总运行"+(end-start)+"毫秒");
}
}
package pattern.proxy.version1;
public class LogProxy extends AbstractProxy{
public LogProxy(Runnable system) {
super(system);
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("start----------");
system.run();
System.out.println("stop----------");
}
}
//测试类
package pattern.proxy.version1;
public class Client {
public static void main(String[] args) {
new TimeProxy(new LogProxy(new SystemA())).run();
new LogProxy(new TimeProxy(new SystemB())).run();
}
}
结果展示:
二、动态代理
应用:AOP······