版权声明:原创欢迎转载,转载请注明出处 https://blog.csdn.net/ye17186/article/details/88800400
代理(Proxy)是一种设计模式,是访问目标对象的另一种方式,在不改变目标对象的提前下,完成对目标对象的扩展。
这里用到了JAVA设计原则--开闭原则:对扩展开放,对修改关闭。
举个例子来说明代理的作用:假设我们需要邀请以为歌手来唱歌,我们并不需要直接去联系具体歌手,而是去联系该歌手的经纪人,来达到同样的目的。这里的歌手就是一个目标对象,他只负责唱歌,而其他的琐事,则有代理对象(经纪人)来完成。
代理模式的关键点:代理对象与目标对象,代理对象是对目标对象的扩展,代理对象会调用目标对象。
JAVA中有三种代理方式,下面一一解释。
一、静态代理
静态代理使用时,需要定义接口或者父类,目标对象和代理对象都要实现相同的接口或者继承相同的父类
以上述歌手、经纪人为例
1、共同的接口类Singer
/**
* 某歌手接口
*
* @author ye17186
* @version 2019/3/25 17:15
*/
public interface Singer {
/**
* 歌手提供唱歌服务
*/
void sing();
}
2、目标对象--歌手SingerImpl
/**
* 目标对象,歌手实现类,提供具体的唱歌服务
*
* @author ye17186
* @version 2019/3/25 17:15
*/
public class SingerImpl implements Singer {
@Override
public void sing() {
System.out.println("i am singing.");
}
}
3、代理对象--经纪人SingerProxy
/**
* 经纪人类,代理自己的歌手
*
* @author ye17186
* @version 2019/3/25 17:18
*/
public class SingerProxy implements Singer{
private Singer singer;
// 代理自己的歌手
public SingerProxy(Singer singer) {
this.singer = singer;
}
@Override
public void sing() {
System.out.println("我是经纪人,我去安排歌手唱歌。");
singer.sing();
System.out.println("唱完了,请付款。");
}
}
四、测试类
public class ProxyMain {
public static void main(String[] args) {
// 目标对象
Singer singer = new SingerImpl();
// 代理对象
SingerProxy sp = new SingerProxy(singer);
// 唱歌
sp.sing();
}
}
结果输出
静态代理总结
1、可以在不修改目标对象的前提下,对目标功能扩展
2、代理对象和目标对象需要实现一样的接口,所有会有很大代理类,类太多,一旦接口增加的方法,目标对象和代理对象都需要同步维护,也就是维护繁琐
如何解决静态代理中的问题,参考【JAVA设计模式】代理模式之动态代理。