1.定义
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
2.UML图
Subject类定义RealSubject和Proxy的公共行为,所以RealSubject出现的地方都可以由Proxy进行替代。在Proxy内部实际上是通过RealSubject对象调用RealSubject的相关方法实现代理操作的。
举个栗子。打游戏经常有找代理刷级的,刷级时需要用钱买装备,这钱谁出?当然是你出,代理用你的钱去买装备升级更快,要是代理自掏腰包,恐怕赚的代理费还不够装备钱的。所以是你先花钱买了点卡,然后你把点卡的充值号码告诉代理,代理就把钱充到游戏账号上了,有钱后代理就可以肆意买装备刷级了。来,照着这个例子画个UML图,如下:
3.Code
Player.java
interface Player{
void recharge();
}
XiaoMing.java
class XiaoMing implements Player{
private GameClient game;
public XiaoMing(GameClient game){
this.game = game;
}
public void recharge(){
System.out.println("XiaoMing买了"+game.getName()+"上的点卡");
}
}
GameProxy.java
class GameProxy implements Player{
private XiaoMing guest;
public GameProxy(GameClient client){
guest = new XiaoMing(client);
}
public void recharge(){
if(guest!=null){
guest.recharge();//花钱的事找顾客
}
}
}
GameClient.java
class Gamelient{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
Client.java
public class Client{
public static void main(String[] args){
GameClient game = new GameClient();
game.setName("梦幻西游");
GameProxy proxy = new GameProxy(game);
proxy.recharge();
}
}
输出
小明买了梦幻西游的点卡
4.总结
最后没有看见小明的影子,只有代理在跟游戏进行交互,但是打印输出的是XiaoMing的recharge方法。由此可见代理模式的好处。GameClient不知道小明的存在,只和代理进行交互,由代理全权负责小明的游戏账号,但是账号的密码,账号上的钱等等其实都是小明的,代理进行充值等操作都是需要小明本人进行操作。代理只是小明找来刷级的,没有小明就不会出现一个代理操作小明的账号,但是一旦小明找了代理刷级,代理就可以代替小明登录游戏账号,GameClient也只认识代理不认识小明。