代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。举例说明,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
通过上面的代理模式描述我们可以知道,其目的就是为了控制对象引用,生活场景中我们以买车为例,如果我们要买一辆轿车必须通过汽车4S店,汽车4s店就是充当代理角色,其目的就是控制买车客户的买车行为,必须通过汽车4S店才能从汽车厂商买一辆车。
代理对象通常和被代理对象实现相同的接口。
1.)首先新建一个买车的接口
public interface IBuyCar {
//买车
void buyCar();
}
2.)声明一个要买车的客户,实现买车接口
public class Customer implements IBuyCar {
private int cash;//购车款
public int getCash() {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
@Override
public void buyCar() {
Log.e("buyCar", "买一辆车花费了-->" + cash + "元");
}
}
3.)声明一个买车代理汽车4S店,同样也实现买车接口,必须接受客户下单
public class BuyCarProxy implements IBuyCar{
private Customer customer;//接收买车客户
public BuyCarProxy(Customer customer){
this.customer=customer;//接收买车客户
}
@Override
public void buyCar() {//实现为客户买车
customer.buyCar();
}
}
4.)创建一个客户端,模拟一次买车
Customer customer=new Customer();
customer.setCash(120000);
BuyCarProxy buyCarProxy=new BuyCarProxy(customer);
buyCarProxy.buyCar();
5.)通过代理模式实现权限控制
通过上面的例子,我们可能有个疑问,难道就不能直接去厂家买车吗?当然可以,如果在使用场景中实现类能满足要求时,我们当然可以直接实现类,但当实现类不能满足要求,要扩展需求,根据开闭原则你又不能修改实现类代码,这时你就用代理类。比如购买一辆车我们要对客户进行一个购车款审核,如果符合条件就买车,不符合要求我们就告知客户购车款不足。
@Override
public void buyCar() {//实现为客户买车
int cash=customer.getCash();
if(cash<100000){
Log.e("buyCar","你的钱不够买一辆车");
return;
}
customer.buyCar();
}