【学习难度:★★★☆☆,使用频率:★★★★☆】
代理模式给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
UML图
代理模式中的角色:
- Subject:公共接口,声明了真实对象和代理对象的公共接口。
- RealSubject:真实对象,代理对象所代理的真实对象,最终引用的对象。
- Proxy:代理对象,包含对真实对象的引用从而操作真实主题对象,对真实对象进行了封装。
结合UML图,这三个角色不是显而易见的吗?
具体代码
有一天我想买一辆宝马,但我不知道该去哪里买,于是我找到了4s店的小王,委托小王帮我买一辆宝马5系。小王在接受我的委托后,在宝马官网订购了一辆车,等车到了4s店后,他又亲自送到了我家楼下,我很开心。过了一段时间,我又想买一辆奔驰,所以这次我二话不说又找到了小王,而小王也同样帮我预定了一辆奔驰GLA后送到了我家楼下。我很开心,非常感谢小王!【本故事纯属虚构】
瞎扯至此,Show me the code!
Subject角色:
public interface BuySomething {
void buyBMW();
void buyBenz();
}
RealSubject角色:
public class People implements BuySomething {
@Override
public void buyBMW() {
System.out.println("I want to buy a BMW, but I don't know how, so I find the proxy");
}
@Override
public void buyBenz() {
System.out.println("I want to buy a Benz, I find the proxy again");
}
}
Proxy角色:
public class Proxy implements BuySomething {
private People people;
public Proxy(People people) {
this.people = people;
}
@Override
public void buyBMW() {
people.buyBMW();
doProxy("BMW");
}
@Override
public void buyBenz() {
people.buyBenz();
doProxy("Benz");
}
private void doProxy(String carName) {
System.out.println("Proxy booking a "+ carName +"...");
System.out.println("Proxy Receive the car");
System.out.println("Proxy send the car to my place...");
System.out.println("I received my car!");
}
}
测试类Client:
public class Client {
public static void main(String[] args) {
People me = new People();
Proxy proxy = new Proxy(me);
System.out.println("One day");
proxy.buyBMW();
System.out.println();
System.out.println("After a few days");
proxy.buyBenz();
}
}