简介
网上很多文章都会巴拉巴拉说一大通设计模式怎么怎么样,代理模式更是老生常谈。这里简单总结一下,然后就说明一下代码实现。
为什么需要代理,首先肯定的是原对象功能不够强大需要增强,又不想改变原来对象原来的拥有权和状态。房产中介就是一个例子,中介可以帮原本的对象代理看房,授权签约。那么为什么需要中介,究其原因就是个人资源有限,中介的传播资源速度更快,可以更快的实现房东需要租卖这一功能。实权依旧在房东这,过户签约必须要有房东,代理需要有房东的授权。清晰明了。
那通过java怎么实现代理呢,本文就只说静态代理,静态代理可利用Java语言的特性实现代理实现,前提是拥有一个统一的接口。
上代码:1.创建接口,2.创建一个实现类,3.创建一个代理类, 4.测试
1.接口
/**
* 静态代理
* 首先,声明接口,以及其抽象方法
*/
public interface InterfaceA {
void exec();
}
2.原实现类
public class RealImplement implements InterfaceA{
@Override
public void exec() {
System.out.println("我是实现类,这是我的执行方法");
}
}
3.代理类
public class ProxyImplement implements InterfaceA {
private InterfaceA interfaceA;
public ProxyImplement(){
interfaceA = new RealImplement();
}
@Override
public void exec() {
System.out.println("do sth before...");
interfaceA.exec();
System.out.println("do sth after...");
}
}
4.测试
public class ProxyTest {
public static void main(String[] args) {
ProxyImplement proxyImplement = new ProxyImplement();
proxyImplement.exec();
}
}
测试结果:
控制待打印
do sth before…
我是实现类,这是我的执行方法
do sth after…
解析
1.Java设计模式的使用往往能灵活使用Java基础
2.静态代理的实现本质是利用了Java几个特性,而根本呢就是灵活使用面向对象的一些特性
Java是面向对象的语言,拥有多态,父类可以调用子类实现
Java接口是统一的规范
Java调用对象除了方法传参,还有直接使用类中的成员对象
可以通过构造方法初始化我们的成员对象
细节分析
上面的例子就是完美体现,两个实现类实现同样的接口,方法名一致。在代理类的构造方法里面实例我们的接口,而且是使用原实现类new的,这样我们就这样我们就可以使用成员调用子类方法,并将其放回同样的方法名字中,即可以实现功能增强,又不需修改原实现类的一点代码。对于老项目的一大块代码,动又不敢动,这就是最佳实践啦。当然缺点也是有缺点的,就只能代理一个对象,想要更强大的增强就需要使用动态代理了。
当然还有几种写法无外乎就是成员直接使用的原实现类,又或者使用有参构造,又或者两者结合使用,本质是类似的。玩的就是Java的成员构造接口。