设计模式之代理模式
所谓代理模式指的是一个类代表另一个类的功能,为其他对象提供一种代理以控制对这个对象的访问。
我们可以用下面的例子来理解
可以创建一个学生类,此学生类拥有做作业的行为方式,然后通过一个代理类去帮助学生做作业 。
学生类 stu
public class Stu {
public void test(String s) {
System.out.println("user" + s);
}
}
创建一个代理类ProxyStudent
public class ProxyStudent {
//需要代理的引用
private Stu stu;
public ProxyStudent(Stu stu) {
this.stu = Stu;
}
//代理做某事
public void test() {
if(stu!=null){
stu = new Stu();
}
stu.test("做做作業。。。");
//其他操作。。。
}
}
调用:
public class Test {
public static void main(String[] args) {
//学生
User user = new User();
//代理对象
ProxyStudent p = new ProxyStudent(user);
p.test();
}
}
输出:
user做做作業。。。
当被请求时,使用 ProxyStudent来获取 stu类的对象。
意图通过ProxyStudent来操作Stu对象,已达到对这个对象的使用,间接的访问操作其他类或者对象。
代理模式就是访问对象时候引入一些间接性的方式,正是通过这些间接性我们可以做很多事。
也可以这么来理解代理:
Proxy ( ProxyStudent )就相当于生活中的代理,比如买东西的时候,我们没必要去生产商品的厂家去购买,而是直接去代理地点商店或者超市购买即可;
代理通过调用委托类来为用户提供同样的服务,而又避免了用户去直接调用委托类 ,相当于加了一个中间人,让这个中间人去做事情 。
代理模式可以用来解决的一些问题
在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
这种写死的代码也被称作静态代理,每次通过不同的代码实现的代理(这个期间class字节码已经被程序员编写好了),代码不能被复用每次都需要去创建相应的代理,不能动态的针对一些条件去动态生成共有的代理。
动态代理可以在运行时期通过对字节码的修改比如第三方库Cglib,或者Jdk提供的动态代理在程序运行时期根据反射动态生成代理对象去代理执行目标对象,在内存中生成代理对象,通过代理对象去执行相应的业务。