1700460226
设计模式之禅 12.4 代理模式的扩展
1700460227
1700460228
12.4.1 普通代理
1700460229
1700460230
在网络上代理服务器设置分为透明代理和普通代理,是什么意思呢?透明代理就是用户不用设置代理服务器地址,就可以直接访问,也就是说代理服务器对用户来说是透明的,不用知道它存在的;普通代理则是需要用户自己设置代理服务器的IP地址,用户必须知道代理的存在。我们设计模式中的普通代理和强制代理也是类似的一种结构,普通代理就是我们要知道代理的存在,也就是类似的GamePlayerProxy这个类的存在,然后才能访问;强制代理则是调用者直接调用真实角色,而不用关心代理是否存在,其代理的产生是由真实角色决定的,这样的解释还是比较复杂,我们还是用实例来讲解。
1700460231
1700460232
首先说普通代理,它的要求就是客户端只能访问代理角色,而不能访问真实角色,这是比较简单的。我们以上面的例子作为扩展,我自己作为一个游戏玩家,我肯定自己不练级了,也就是场景类不能再直接new一个GamePlayer对象了,它必须由GampePlayerProxy来进行模拟场景,类图修改如图12-4所示。
1700460233
1700460234
1700460235
1700460236
1700460237
图12-4 普通代理类图
1700460238
1700460239
改动很小,仅仅修改了两个实现类的构造函数,GamePlayer的构造函数增加了_gamePlayer参数,而代理角色则只要传入代理者名字即可,而不需要说是替哪个对象做代理。GamePlayer类如代码清单12-10所示。
1700460240
1700460241
代码清单12-10 普通代理的游戏者
1700460242
1700460243
public class GamePlayer implements IGamePlayer{
1700460244
1700460245
private String name=””;
1700460246
1700460247
//构造函数限制谁能创建对象,并同时传递姓名
1700460248
1700460249
public GamePlayer(IGamePlayer_gamePlayer,String_name)throws Exception{
1700460250
1700460251
if(_gamePlayer==null){
1700460252
1700460253
throw new Exception(“不能创建真实角色!”);
1700460254
1700460255
}else{
1700460256
1700460257
this.name=_name;
1700460258
1700460259
}
1700460260
1700460261
}
1700460262
1700460263
//打怪,最期望的就是杀老怪
1700460264
1700460265
public void killBoss(){
1700460266
1700460267
System.out.println(this.name+“在打怪!”);
1700460268
1700460269
}
1700460270
1700460271
//进游戏之前你肯定要登录吧,这是一个必要条件
1700460272
1700460273
public void login(String user,String password){
1700460274
[
上一页 ]
[ :1.700460225e+09 ]
[
下一页 ]