静态代理模式(StaticProxy)
实现静态代理需要满足的条件:
1、真实主题类和代理类必须实现同一个接口;
2、代理类必须包含真实主题类的引用;
代码示例
public class TestStaticProxy {
public static void main(String[] args) {
//创建真实主题类
Proxy real = new Real();
//把真实主题类给代理类,并创建代理类
Proxy proxy = new StaticProxy(real);
//执行代理类中增强的方法
proxy.work();
}
}
class StaticProxy implements Proxy{
private Proxy real;
public StaticProxy(Proxy real){
this.real = real;
}
public void before(){
System.out.println("工作前的准备……");
}
public void after(){
System.out.println("工作完收尾……");
}
/**
*通过代理类增强功能
*/
@Override
public void work() {
before();
//调用真实主题类的方法实现
real.work();
after();
}
}
class Real implements Proxy{
@Override
public void work() {
System.out.println("我是真实主题类,我要开始工作了……");
}
}
interface Proxy{
void work();
}
运行结果
工作前的准备……
我是真实主题类,我要开始工作了……
工作完收尾……
其实在多线程中也用到了静态代理模式
public class Demo02 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("我自己创建的多线程例子======"+i);
}
}
public static void main(String[] args) {
Demo02 demo02 = new Demo02();
new Thread(demo02).start();
for (int i = 0; i < 10000; i++) {
System.out.println("这是main线程======"+i);
}
}
}
public class Thread implements Runnable {} //Thread类实现了Runnable接口
这里的Demo02实现了Runnable接口,同时Thread类也实现了Runnable接口,这样就满足了第一个条件;
public class Demo02 implements Runnable{}
public class Thread implements Runnable {} //Thread类实现了Runnable接口
代理类包含了真实类的引用,demo02真实类的引用给到代理类 target这就是真实类的引用
Demo02 demo02 = new Demo02();
new Thread(demo02).start();
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
//我们自定义静态代理测试代码和多线程代码比较
Proxy real = new Real();
Proxy proxy = new StaticProxy(real).work;
Demo02 demo02 = new Demo02();
new Thread(demo02).start();