代理模式主要用于通过提供代理对象来控制对实际对象的访问。比如在C/S场景中应用代理模式的时候,客户端的请求首先会发送给服务端代理,服务端代理对象会对客户端的请求进行简单的过滤,对于无效的请求就会直接返回,而不用发送给服务端,而对于有效的请求则会发送给服务端进行处理。
代理模式适用于控制访问那些不想暴露接口和数据给外部的业务对象 或者不方便被其他对象直接引用的业务对象,这些业务对象只需要通过代理对象作为中介和外部的对象进行交互。
代理对象和实际对象具有相同的接口,在实际的应用场景中它能代替实际对象的功能。
代理模式中主要有三种角色:抽象功能,代理对象,实际对象
抽象功能代表着实际对象所拥有的功能,代理对象和实际对象都会实现抽象功能
代理对象是用来代理实际对象的,他会持有一个实际对象的引用,并且实现和实际对象相同的抽象功能。
实际对象就是我们需要控制访问的对象,它实现了抽象功能。它让代理对象来代表它处理和外部对象的交互
我以手机厂商销售手机来说明代理模式,手机厂商销售手机的时候会寻找代理商,这些代理商帮助手机厂商销售。那么手机厂商就是代理模式中的实际对象,手机厂商的代理商就是代理对象,销售手机的行为就是抽象功能,这三个角色的关系如下图所示
PhoneFactory,代表实际对象,PhoneFactoryProxy,代表代理对象,IPhoneFactoryBehavior,代表抽象功能。
PhoneFactory 和 PhoneFactoryProxy 都实现 代表抽象功能的接口 IPhoneFactoryBehavior .PhoneFactoryProxy 持有一个 PhoneFactory 的引用。
具体实现如下所示
IPhoneFactoryBehaviro.java
public interface IPhoneFactoryBehavior {
public int sellPhone();
}
PhoneFactory.java
public class PhoneFactory implements IPhoneFactoryBehavior {
@Override
public int sellPhone() {
// TODO Auto-generated method stub
return 1;
}
}
PhoneFactoryProxy.java
public class PhoneFactoryProxy implements IPhoneFactoryBehavior {
PhoneFactory mPhoneFactory;
public PhoneFactoryProxy(PhoneFactory phoneFactory){
this.mPhoneFactory = phoneFactory;
}
public PhoneFactoryProxy (){
this.mPhoneFactory = new PhoneFactory();
}
@Override
public int sellPhone() {
// TODO Auto-generated method stub
return mPhoneFactory.sellPhone();
}
}
实际对象和代理对象实现相同的抽象功能,所以我们在需要使用实际对象的地方都可以用代理对象来代替。代理对象在外部对象和实际对象之间起了一个中介作用。代理对象可以对外部对象的请求进行预处理。