学习java的23种代理模式的时候,今上午学习了装饰者模式和代理模式,发现装饰者模式和代理模式里面的静态代理模式太像了,然后各种找资料,但是无意中却发现很多关于代理模式的静态代理模式的博客都存在一些问题(只是我个人的一点看法,后面会详细讲,如果的确是我错了还望各位能够指正,谢谢了!)
先来看我找到的静态代理模式代码:
/*** 接口
*/
public interface IUserDao {
void save();
} /**
* 接口实现
* 被代理类(委托类)
*/
public class UserDao implements IUserDao {
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("数据已保存!");
}
}
/**
* 代理对象,静态代理
*/
public class UserDaoProxy implements IUserDao {
private IUserDao target;
public UserDaoProxy(IUserDao target) {
this.target = target;
}
@Override
public void save() {
System.out.println("添加功能,也可以控制委托类,比如加一些判断!");
target.save();
System.out.println("扩展功能!");
}
}
/**
* 测试类,模仿客户端
*/
public class App {
public static void main(String[] args) {
UserDao target = new UserDao();
IUserDao proxy = new UserDaoProxy(target);
proxy.save();
}
}
但是在我的理解中,这并不是静态代理模式,而是装饰者模式,代理模式实现的目的就是让委托类与客户(调用者)之间不产生直接关系,而是交给代理对象去处理,当然,代理对象对这个委托类有控制权,但是在此例中,客户端中,竟然出现了委托类的对象实例,也就是客户和委托类产生了直接的联系,虽然最终仍然是将工作交给代理对象去完成的,但是这不就违背了代理模式的设计出发点了吗?
所以我认为代码应该应该做出如下更改:(只需要改代理对象和客户端代码)
/**
* 代理对象,静态代理
*/
public class UserDaoProxy implements IUserDao {
private IUserDao target;
public UserDaoProxy() {
/**
* 在编译的时候就知道要代理哪个类
*/
this.target = new UserDao();
}
@Override
public void save() {
System.out.println("添加功能,也可以控制委托类,比如加一些判断!");
target.save();
System.out.println("扩展功能!");
}
}
public class App {
public static void main(String[] args) {
/**
* 客户并不知道代理委托了另一个对象
*/
IUserDao proxy = new UserDaoProxy();
proxy.save();
}
}
这样的话,委托类就和客户之间没有直接联系,客户只和代理对象交流,代理对象再去和最终执行任务的对象交流。
结尾语:有意思的是当我找关于静态代理对象与装饰者模式之间的区别时,找到的资料思路和我一样,但是当我去找java设计模式之代理模式的资料时,里面给的静态代理模式就是文章开篇的版本!