Java中的设计模式-四(代理模式)

74 阅读3分钟

释义

  为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。生活中最能接触到该理念的就是租房时候的中介,由于个人工作时间原因,或者资源问题,自己无法找到合适房源,那就会找一个中介来处理这些事情,这个逻辑放到开发中就属于代理模式。

案例

  针对租赁房屋这个需求,创建我们的实体对象。

//房间类,只有一个房间名字属性
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的介绍。 image.png