一、代理模式是干啥的?
代理模式是为其他对象提供一种代理以控制这个对象的访问。 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
二、代理模式涉及到哪些具体角色呢?
代理模式一般涉及的角色有:
抽象角色(租房子):
声明真实对象和代理对象的共同接口
代理角色(中介):
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色(房主):
代理角色所代表的真实对象,是我们要最终要引用的对象。
以下以租房为实例,代码如下:
租房的抽象类:
/**
* 房屋抽象类
* @author Administrator
*
*/
public abstract class House {
public abstract void rent();
}
代理对象和真实对象必须都继承该抽象类,如果抽象角色是接口的话,则代理对象和真实对象必须都实现该接口。
以下是真实对象的代码,真实对象必须和代理对象一样,继承或者实现抽象角色
/**
* 房东
* @author Administrator
*
*/
public class HouseOwner extends House {
@Override
public void rent() {
System.out.println("出租房屋!");
}
}
中介作为房东的代理,在代理模式中充当的代理对象的角色,中介的代码如下:
/**
* 房屋中介
* @author Administrator
*
*/
public class HouseProxy extends House {
private HouseOwner houseOwner;
@Override
public void rent() {
if(houseOwner==null){
houseOwner = new HouseOwner();
}
//中介收取中介费
HouseProxy.getRent();
//调用真实对象的方法
houseOwner.rent();
}
public static void getRent(){
System.out.println("收取中介费");
}
}
根据前面的说明,代理对象持有对真实对象的引用,可以操作真实对象,所以在操作真实对象之前后可以进行自己的一些操作(如之前收取佣金)
客服端调用代理对象时的代码如下:
/**
* 租房者
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
House house = new HouseProxy();
house.rent();
}
}