静态代理总结:
真实对象和代理对象都要实现同一个接口。
代理对象要代理真实的角色
好处:
可以对真实对象的方法进行扩充
不用再去在真实对象中的方法进行修改。
举例
我们以我们结婚为例。我们结婚通常都会去找婚庆中介,然后让他们给我们负责布置婚礼,我们只要去参加婚礼就可以了。所以这里的真实对象是我们人,而代理对象很明显就是婚庆公司。我们要做的事是结婚,所以接口的方法是结婚。
接口:
package com.yzx.proxy;
/**
*
* 结婚接口
*/
public interface Marry {
public void happyMarry();
}
真实对象新郎
package com.yzx.proxy;
public class Bridegroom implements Marry{
@Override
public void happyMarry() {
System.out.println("新郎结婚非常的开心、幸福。");
}
}
婚庆公司代理
package com.yzx.proxy;
/**
* 代理对象:婚庆公司
*/
public class WeddingProxy implements Marry{
private Marry bridegroom;
public WeddingProxy(Marry bridegroom) {
this.bridegroom = bridegroom;
}
@Override
public void happyMarry() {
before();
bridegroom.happyMarry();
after();
}
private void before() {
System.out.println("布置婚礼,很忙碌。");
}
private void after() {
System.out.println("婚礼结束收尾款,很头大。");
}
}
这里婚庆公司在结婚这件事上还有了婚前布置和婚后收费,而真正结婚的人必须要新郎到场才能进行结婚。
测试
public static void main(String[] args) {
// 创建代理对象
WeddingProxy weddingProxy = new WeddingProxy(new Bridegroom());
// 执行经过代理后的结婚方法
weddingProxy.happyMarry();
}
结果
Threa中的静态代理
上述中的测试代码可以简化
public class StaticProxy {
public static void main(String[] args) {
// 创建代理对象
// WeddingProxy weddingProxy = new WeddingProxy(new Bridegroom());
// 执行经过代理后的结婚方法
// weddingProxy.happyMarry();
new WeddingProxy(new Bridegroom()).happyMarry();
}
}
通过与Thread创建线程相比
new Thread(一个继承了Runnable接口的实现类).start();
可以得出,Thread使用了静态代理。