释义
为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。生活中最能接触到该理念的就是租房时候的中介,由于个人工作时间原因,或者资源问题,自己无法找到合适房源,那就会找一个中介来处理这些事情,这个逻辑放到开发中就属于代理模式。
案例
针对租赁房屋这个需求,创建我们的实体对象。
//房间类,只有一个房间名字属性
public class Room {
private final String name;
public Room(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Me implements Renting {
private final Room room;
public Me(Room room) {
this.room = room;
}
public void getRoom() {
System.out.println("获取到一个"+room.getName());
}
public void rentingHouse() {
System.out.println(room.getName()+"被成功租赁");
}
}
public static void main(String[] args) {
Me me = new Me(new Room("mm"));
me.getRoom();
me.rentingHouse();
}
当自己去找房间的话,正如上面程序所演示的一样,给Me实体中注入房间属性,执行租赁方法。但是往往我们是需要一个中介来替我们完成找房间,以及签署合同等工作的。那么加入代理模式后,就演变成了如下的操作,我们找的中介,一定是要完成我们想要完成的工作,不能说他去完成和我们无关的工作。所以这里用接口把我们要执行的方法抽取出来。共同实现它。
public interface Renting {
void getRoom();
void rentingHouse();
}
//定义中介类
public class Intermediary implements Renting {
private final Me me;
public Intermediary(Room room) {
this.me = new Me(room);
}
@Override
public void getRoom() {
me.getRoom();
}
@Override
public void rentingHouse() {
me.rentingHouse();
}
}
public static void main(String[] args) {
Intermediary intermediary = new Intermediary(new Room("mm"));
intermediary.getRoom();
intermediary.rentingHouse();
}
Me类不用做修改,可以发现,中介类实现了和Me类中一样的方法,不过这里我们注入了Me的实体,具体逻辑调用还是调用的Me中的方法。但是做这个操作的角色发生了转变。通过main方法看到,我们创建中介的实体对象,并用它来调用所需要的方法。
简单的代理逻辑就是这样,我们在学习spring的时候会接触到很多的代理,Aop的实现本质就是使用了代理方式,比如在该例子中,中介可以在寻找房子的前后做一些操作,比如找到房间后,发送消息通知我们已经找到了房子。spring中使用代理不仅对业务本身进行了代理,而且还可以附加操作。当然了spring中的代理并不会有这么简单,spring还分为静态代理和动态代理(动态代理又分为jdk动态代理和cglib动态代理)。这里就不再一一赘述,详细可以看到我在spring专栏里面对Aop的介绍。