StackOverflow 并不只是三个问答网站

12.1 小编是娱乐至尊

     
2005年,感觉很低俗,于是就玩了一段时间的互连网游戏,游戏名就背着了,要不就有做广告的存疑,反正就是打怪、升级、砍人、被人砍,然后继续打怪、升级、打怪、升级······作者花了八个月的小时升级到80级,已经很有形成感了,可是还被人杀死,高手四处都以,GM(Game
Master,游戏管理员)也不管,对于小编这种非兰德酷路泽MB玩家基本上都是无心搭理。在那段时光本身是体会到互联网游戏的乐与苦,参加家族(工会)攻城,胜利后那叫2个乐呀,感觉本身正是叁个“残忍战士”,无往不胜!那苦是何等吗?就是提高,为了升一流,就要到出杀怪,做义务,那几个游戏还很变态,外挂管得很严,基本上出个外挂,没了两日就起来封账号,不敢用,升级基本上都要靠自身手打,累啊!小编曾经的记录是连着打了25个钟头,睡觉在梦中还和大BOSS在PK。有诸如此类一段经历依旧很有趣,作为架构师是还是不是可以把那段经历通过架构的艺术记录下啊?当然能够了,大家把那段打游戏的历程系统化,相当简单的多少个进度,如图12-1所示。

美高梅娱乐4858.com 1

图12-1 游戏进程

     
太简单了,定义八个接口IGamePlayer,是装有热爱互连网游戏的玩家,然后定义一个切实的贯彻类GamePlayer,已毕逐个游戏爱好者为了玩游戏要实施的作用。代码也卓殊简单,大家先来看IGamePlayer,如代码清单12-1所示。

代码清单12-1 游戏者接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface IGamePlayer {
 
//登录游戏
 
public void login(String user,String password);
 
//杀怪,网络游戏的主要特色
 
public void killBoss();
 
//升级
 
public void upgrade();
 
}

     
十分简单,定义了七个主意,分别是大家在互连网游戏中最常用的成效:登录游戏、杀怪和升级换代,其落成类如代码清单12-2所示。

代码清单12-2 游戏者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class GamePlayer implements IGamePlayer {
 
private String name = "";
 
//通过构造函数传递名称
 
public GamePlayer(String _name){
 
this.name = _name;
 
}
 
//打怪,最期望的就是杀老怪
 
public void killBoss() {
 
System.out.println(this.name + "在打怪!");
 
}
 
//进游戏之前你肯定要登录吧,这是一个必要条件
 
public void login(String user, String password) {
 
System.out.println("登录名为"+user + " 的用户 " + this.name + "登录成功!");
 
}
 
//升级,升级有很多方法,花钱买是一种,做任务也是一种
 
public void upgrade() {
 
System.out.println(this.name + " 又升了一级!");
 
}
 
}

     
在落实类中通过构造函数传递进入玩家姓名,方便开展早先时期的调剂工作。我们通过3个场景类来模拟那样的玩乐经过,如代码清单12-3所示。

代码清单12-3 场景类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class GamePlayer implements IGamePlayer {
 
private String name = "";
 
//通过构造函数传递名称
 
public GamePlayer(String _name){
 
this.name = _name;
 
}
 
//打怪,最期望的就是杀老怪
 
public void killBoss() {
 
System.out.println(this.name + "在打怪!");
 
}
 
//进游戏之前你肯定要登录吧,这是一个必要条件
 
public void login(String user, String password) {
 
System.out.println("登录名为"+user + " 的用户 " + this.name + "登录成功!");
 
}
 
//升级,升级有很多方法,花钱买是一种,做任务也是一种
 
public void upgrade() {
 
System.out.println(this.name + " 又升了一级!");
 
}
 
}

     
程序记录了娱乐的先导时间和了结时间,同时也记录了在戏耍进度中都亟需做什么工作,运维结果如下:

发端时间是:二〇〇九-8-25 10:45

签到名为zhangSan 的用户 张三登录成功!

张三在打怪!

张三 又升了一流!

终止时间是:二〇〇九-8-26 03:40

     
运维结果也是我们想要的,记录自身那段日子的网游生涯。感情学家告诉我们,人类对于磨难的回想比对热情洋溢的记得要深远,不过人类对于喜欢是“趋利”性的,每一种人都想Happy,都不想让魔难靠近,要想取得幸福,患难也是再所难免的,大家的网游生涯也是如此,游戏打时间长了,腰酸背痛、眼涩枯槁、手臂酸麻,等等,约等于网络成瘾综合症都出去了,其结果就像是吃了更加“二十五日遇难散”,“筋脉逆流,胡思乱想,而致走火入魔”。那怎么办呢?大家想玩游戏,但又不想碰触到游戏中的烦恼?怎么样缓解吧?

     
有点子,以往游戏代练的合作社丰富多,小编把温馨的账号交给代练人员,由她们去帮小编升级,去打怪,非凡好的想法,大家来修改一下类图,如图12-2所示。

美高梅娱乐4858.com 2

图12-2 游戏代练扶助打怪

     
在类图中加进了一个GamePlayerProxy类来表示游戏代练者,它也不大概有营私舞弊的格局呀,游戏代练者也是手动打怪呀,由此等同两次三番IGamePlayer接口,其落成如代码清单12-4所示。

代码清单12-4 代练者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class GamePlayerProxy implements IGamePlayer {
 
private IGamePlayer gamePlayer = null;
 
//通过构造函数传递要对谁进行代练
 
public GamePlayerProxy(IGamePlayer _gamePlayer){
 
this.gamePlayer = _gamePlayer;
 
}
 
//代练杀怪
 
public void killBoss() {
 
this.gamePlayer.killBoss();
 
}
 
//代练登录
 
public void login(String user, String password) {
 
this.gamePlayer.login(user, password);
 
}
 
//代练升级
 
public void upgrade() {
 
this.gamePlayer.upgrade();
 
}
 
}

     
很简短,首先通过构造函数表达要代什么人打怪升级,然后通过手动开始代用户打怪、升级。场景类Client代码也稍作改动,如代码清单12-5所示。

代码清单12-5 立异后的场景类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Client {
 
public static void main(String[] args) {
 
//定义一个痴迷的玩家
 
IGamePlayer player = new GamePlayer("张三");
 
//然后再定义一个代练者
 
IGamePlayer proxy = new GamePlayerProxy(player);
 
//开始打游戏,记下时间戳
 
System.out.println("开始时间是:2009-8-25 10:45");
 
proxy.login("zhangSan", "password");
 
//开始杀怪
 
proxy.killBoss();
 
//升级
 
proxy.upgrade();
 
//记录结束游戏时间
 
System.out.println("结束时间是:2009-8-26 03:40");
 
}
 
}

      运转结果也完全相同,依旧张三那些用户在打怪,运维结果如下:

发端时间是:二〇〇九-8-25 10:45

登录名为zhangSan 的用户 张三登录成功!

张三在打怪!

张三 又升了超级!

终结时间是:贰零零玖-8-26 03:40

     
是的,没有其余变动,可是你有没有察觉,你的游玩早已在晋级,有人在帮你工作了!终于晋升到120级,然后基本上是本服无对手,除了GM外,这些您可惹不起!那就是代理方式。

今天收看了2个网站的模拟StackOverflow的问答应用,有点儿感慨:是否安排性那么些宪章应用的人,真的认为,StackOverflow真的就是提供咨询和平解决答服务的?StackOverflow
的精髓,首先在于其名誉(Reputation)系统,那才是去解答的人要的,然则这些宪章的应用,居然都不出示用户的声望值。

12.2 代理方式的定义

      代理形式(Proxy Pattern)是贰个使用率极度高的方式,其定义如下:

      provide a surrogate or placeholder for another object to control
access to it. 为其他对象提供一种代理以决定对那几个目的的走访。

      代理方式的通用类图如图12-3所示。

美高梅娱乐4858.com 3

图12-3 代理格局的通用类图

美高梅娱乐4858.com,     
代理形式也称之为委托形式,它是一项宗旨布置技术,许多其它的格局,如景况方式、策略方式、访问者形式本质上是在更破例的场合使用了寄托方式,而且在日常的应用中,代理情势可以提供充裕好的访问控制,在一些显赫开源软件中也时常见到它的身形,如Struts2的Form成分映射就利用了代办形式(准确的身为动态代理情势)。大家先看一下类图中的两个角色的定义:

  • Subject抽象宗旨剧中人物

     
抽象宗旨类可以是抽象类也足以是接口,是2个最家常的工作类型定义,无特殊须求。

  • RealSubject 具体宗旨角色

     
也号称被信托剧中人物、被代理角色,它才是冤大头,是事情逻辑的切实实施者。

  • Proxy 代理宗旨剧中人物

     
也称之为委托类、代理类,它承受对实在剧中人物的使用,把全部抽象核心类定义的办法限制委托给真实宗旨角色落成,并且在真正主旨角色处理达成前后做预处理和善后处理工作。

      大家首先来看Subject抽象核心类的通用源码,如代码清单12-6所示。

代码清单12-6 抽象核心类

1
2
3
4
5
6
7
public interface Subject {
 
//定义一个方法
 
public void request();
 
}

     
在接口中我们定义了3个措施request来作为艺术的象征,RealSubject对它进行落到实处,如代码清单12-7所示。

代码清单12-7 真实大旨类

1
2
3
4
5
6
7
8
9
10
11
public class RealSubject implements Subject {
 
//实现方法
 
public void request() {
 
//业务逻辑处理
 
}
 
}

     
RealSubject是1个例行的政工完成类,代理形式的主导就在代理类上,如代码清单12-8所示。

代码清单12-8 代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class Proxy implements Subject {
 
//要代理哪个实现类
 
private Subject subject = null;
 
//默认被代理者
 
public Proxy(){
 
this.subject = new Proxy();
 
}
 
//通过构造函数传递代理者
 
public Proxy(Object...objects ){
 
}
 
//实现接口中定义的方法
 
public void request() {
 
this.before();
 
this.subject.request();
 
this.after();
 
}
 
//预处理
 
private void before(){
 
//do something
 
}
 
//善后处理
 
private void after(){
 
//do something
 
}
 
}

     
看到此间,我们别感叹,为啥会现出before和after方法,继续看下去,那是一个“引子”,可以引出三个全新的编程形式。

     
多少个代理类可以代劳八个被委托者或被代理者,由此3个代理类具体代理哪个真实大旨角色,是由场景类决定的,当然,最简易的情形就是七个核心类一个代理类,那是最精简的代办形式。在普通情状下,一个接口只须要3个代理类就可以了,具体代理哪个已毕类由高层模块来支配,约等于在代理类的构造函数中传递被代理者,例如大家得以在代理类Proxy中加进如代码清单12-9所示的构造函数。

代码清单12-9 代理的构造函数

1
2
3
4
5
public Proxy(Subject _subject){
 
this.subject = _subject;
 
}

     
你要代理何人,爆发该代理的实例,然后把被代理者传递进入,该方式在实质上的门类选用中比较普遍。

StackOverflow
提供高质量的问答内容,那是其受欢迎的向来。而怎么样落成这点,才是其团伙的过人之处。作者从三个普通用户的角度,说说自身的感触。

12.3 代理情势的行使

 

12.3.1 代理形式的亮点
  • 义务鲜明

     
真实的角色就是落到实处实际的业务逻辑,不用关切其余非本职分的事务,通过早先时期的代理完成一件已毕业务,附带的结果就是编程简洁清晰。

  • 高增加性

     
具体大旨角色是时刻都会发生变化的,只要它完结了接口,甭管它怎样转变,都逃不脱世尊的掌心(接口),那我们的代理类完全就足以在不做任何修改的动静下利用。

  • 智能化

     
那在大家上述讲解中还不曾反映出来,可是在大家以下的动态代理章节中你就会看出代理的智能化,读者有趣味也可以看看Struts是何等把表单成分映射到目的上的。

高品质的问答内容,不是靠拉专家、删水贴、屏蔽垃圾用户完结的,那样做,管理员会累死,而且还不能保障结果就是好的。专家你能找到多少个,你又有微微精力和力量去分辨哪些是污物?

12.3.2 代理形式的运用

小编深信第3回接触到代办情势的读者必定很窝囊,为何要用代理呀,是的,为何要用代理?想想现实世界呢,你为啥要找代理律师,你去打官司,为啥要找个律师?因为您不想插足中间经过的是是非非,只要形成自身的辩论就成,其余的比如说事先调查、事后追查都由律师来解决,那就是为了减轻你的承受。代理情势应用相当多,我们可以看看Spring
AOP,那是三个不胜卓绝的动态代理。

之所以,必须有3个方式,既不打击用户咨询回答的热心,又不会让垃圾、水贴内容各处飞,而且还不给管理员增添负担、让管理员变成网站发展壮大的瓶颈呢?

12.4 代理形式的恢宏

 

12.4.1 普通代理

     
在网络上代理服务器设置分为透大顺理和日常代理,是怎么样看头吧?透明清理就是用户不用安装代理服务器地址,就足以从来访问,相当于说代理服务器对用户来说透明的,看不到,不用知道它存在的;普通代理则是内需用户本身安装代理服务器的IP地址,用户必须知道代理的存在。我们设计方式中的普通代理和威吓代理也是类似的一种结构,普通代理就是我们要清楚代理的留存,约等于相近的GamePlayerProxy那么些类的存在,然后才能访问;强制代理则是调用者直接调用真实剧中人物,而不用关爱代理是或不是留存,其代理的暴发是由真正角色决定的,那样表达如故相比复杂,我们还是用实例来讲课。

     
首先说一般代理,它的渴求就是客户端只能够访问代理角色,而无法访问真正角色,那是比较简单的,大家以地方的事例作为扩张,我本身当作叁个嬉戏玩家,作者必然本身不练级了,也等于场景类不只怕再向来new3个GamePlayer对象了,它必须由GampePlayerProxy来展开模拟场景,类图修改如图12-4所示。

美高梅娱乐4858.com 4

图12-4 普通代理类图

     
改动十分的小,仅仅修改了多少个达成类的构造函数,GamePlayer的构造函数扩大了_gamePlayer参数,而代理角色则只要传入代理者名字即可,而不须求说是替哪个目的做代办。GamePlayer类如代码清单12-10所示。

代码清单12-10 普通代理的游戏者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class GamePlayer implements IGamePlayer {
 
private String name = "";
 
//构造函数限制谁能创建对象,并同时传递姓名
 
public GamePlayer(IGamePlayer _gamePlayer,String _name) throws Exception{
 
if(_gamePlayer == null ){
 
throw new Exception("不能创建真是角色!");
 
}else{
 
this.name = _name;
 
}
 
}
 
//打怪,最期望的就是杀老怪
 
public void killBoss() {
 
System.out.println(this.name + "在打怪!");
 
}
 
//进游戏之前你肯定要登录吧,这是一个必要条件
 
public void login(String user, String password) {
 
System.out.println("登录名为"+user + " 的用户 " + this.name + "登录成功!");
 
}
 
//升级,升级有很多方法,花钱买是一种,做任务也是一种
 
public void upgrade() {
 
System.out.println(this.name + " 又升了一级!");
 
}
 
}

     
在构造函数中,传递进入一个IGamePlayer对象,检查哪个人能成立真实的剧中人物,当然还足以有其他的限量,比如类名必须为Proxy类等等,读者可以依照实际境况展开扩充。GamePlayerProxy如代码清单12-11所示。

代码清单12-11 普通代理的代理者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class GamePlayerProxy implements IGamePlayer {
 
private IGamePlayer gamePlayer = null;
 
//通过构造函数传递要对谁进行代练
 
public GamePlayerProxy(String name){
 
try {
 
gamePlayer = new GamePlayer(this,name);
 
} catch (Exception e) {
 
// TODO 异常处理
 
}
 
}
 
//代练杀怪
 
public void killBoss() {
 
this.gamePlayer.killBoss();
 
}
 
//代练登录
 
public void login(String user, String password) {
 
this.gamePlayer.login(user, password);
 
}
 
//代练升级
 
public void upgrade() {
 
this.gamePlayer.upgrade();
 
}
 
}

     
仅仅修改了构造函数,传递进入一个代理者名称,即可开展代理,在那种改造下,系统越来越从简了,调用者只了然代理存在就可以,不用知道代理了何人。同时场景类也稍作改动,如代码清单12-12所示。

代码清单12-12 普通代理的场景类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class GamePlayerProxy implements IGamePlayer {
 
private IGamePlayer gamePlayer = null;
 
//通过构造函数传递要对谁进行代练
 
public GamePlayerProxy(String name){
 
try {
 
gamePlayer = new GamePlayer(this,name);
 
} catch (Exception e) {
 
// TODO 异常处理
 
}
 
}
 
//代练杀怪
 
public void killBoss() {
 
this.gamePlayer.killBoss();
 
}
 
//代练登录
 
public void login(String user, String password) {
 
this.gamePlayer.login(user, password);
 
}
 
//代练升级
 
public void upgrade() {
 
this.gamePlayer.upgrade();
 
}
 
}

     
运转结果完全相同。在该方式下,调用者只知代理而不用了解真实的脚色是哪个人,屏蔽了实事求是角色的更改对高层模块的影响,真实的主题角色爱怎么修改就怎么修改,对高层次的模块没有任何的熏陶,只要您兑现了接口所对应的法门,该形式分外适合对增添性要求较高的场面。当然,在骨子里的连串中,一般都以透过预订来禁止new八个忠实的剧中人物,也是1个十一分好的方案。

     
注意 常备代理形式的束缚难题,尽量通过集体内的编程规范类约束,因为每1个宗旨类是可被收录的和可有限协理的,使用技术封锁的艺术对系统维护是一种十二分不利于的因素。

小编们可以先回头想想卡宴PG游戏(包罗互连网EvoquePG,纵然本身不玩网游)。你从NPC那里领取3个职分,要你去何地何地找到NPC丢失的物品并偿还NPC。是什么样促使你在不到30寸的屏幕里面转悠多少个小时,各类跑路、各样迷宫、各样打怪、死了还要再Load重来,最后拿到物品还要回到去找NPC并归还TA?你真的是关心那么些物品对于NPC的价值呢?

12.4.2 强制代理

     
强制代理在设计格局中比较另类,为啥如此说呢?一般的考虑都以透过代办找到实际的剧中人物,不过强制代理却是要“强制”,你必须透过真实角色查找到代办角色,否则你不能访问,甭管您是透过代理类还是通过一向new贰个核心脚色类,都不可以访问,唯有通过诚实角色指定的代理类才得以访问,相当于说由真正剧中人物管理代理剧中人物,这么说啊,高层模块new了一个诚实剧中人物的目的,再次来到的却是代理角色,那就好比是你和二个歌手比较熟,相互认识,有件业务你须要向他确认一下,于是你就径直拨通了超新星的对讲机:

      “喂,沙比呀,小编要见一下XXX出品人,你帮下忙了!”

      “不行呀衰哥,小编这几天很忙啊,你找我的商行吧…”

     
郁闷了吧,你是想一贯绕过他的代办,何人知道重回的照旧他的代办,那就是挟持代理,你可以毫无知道代理存在,但是你的一言一动依然须求代理为您提供。大家把上边的例子稍作修改就可以形成,如图12-5所示。

美高梅娱乐4858.com 5

图12-5 强制代理类图

     
在接口上加码了三个getProxy方法,真实角色GamePlayer可以钦点三个和好的代理,除了代理外哪个人都无法访问。我们来看代码,先看IGamePlayer接口,如代码清单12-13所示。

代码清单12-13 强制代理的接口类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface IGamePlayer {
 
//登录游戏
 
public void login(String user,String password);
 
//杀怪,这是网络游戏的主要特色
 
public void killBoss();
 
//升级
 
public void upgrade();
 
//每个人都可以找一下自己的代理
 
public IGamePlayer getProxy();
 
}

     
仅仅增加了2个getProxy方法,钦赐要拜访自身必须透过哪个代理,落成类也要做适合的修改,先看真正角色GamePlayer,如代码清单12-14所示。

代码清单12-14 强制代理的实在角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
public class GamePlayer implements IGamePlayer {
 
private String name = "";
 
//我的代理是谁
 
private IGamePlayer proxy = null;
 
public GamePlayer(String _name){
 
this.name = _name;
 
}
 
//找到自己的代理
 
public IGamePlayer getProxy(){
 
this.proxy = new GamePlayerProxy(this.name);
 
return this.proxy;
 
}
 
//打怪,最期望的就是杀老怪
 
public void killBoss() {
 
if(this.isProxy()){
 
System.out.println(this.name + "在打怪!");
 
}else{
 
System.out.println("请使用指定的代理访问");
 
}
 
}
 
//进游戏之前你肯定要登录吧,这是一个必要条件
 
public void login(String user, String password) {
 
if(this.isProxy()){
 
System.out.println("登录名为"+user + " 的用户 " + this.name + "登录成功!");
 
}else{
 
System.out.println("请使用指定的代理访问");;
 
}
 
}
 
//升级,升级有很多方法,花钱买是一种,做任务也是一种
 
public void upgrade() {
 
if(this.isProxy()){
 
System.out.println(this.name + " 又升了一级!");
 
}else{
 
System.out.println("请使用指定的代理访问");
 
}
 
}
 
//校验是否是代理访问
 
private boolean isProxy(){
 
if(this.proxy == null){
 
return false;
 
}else{
 
return true;
 
}
 
}
 
}

     
扩大了1个个体方法,检查是还是不是是本人钦定的代理,是点名的代办则允许访问,否则不允许访问。大家再来看代理角色,如代码清单12-15所示。

代码清单12-15 强制代理的代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class GamePlayerProxy implements IGamePlayer {
 
private IGamePlayer gamePlayer = null;
 
//构造函数传递用户名
 
public GamePlayerProxy(IGamePlayer _gamePlayer){
 
this.gamePlayer = _gamePlayer;
 
}
 
//代练杀怪
 
public void killBoss() {
 
this.gamePlayer.killBoss();
 
}
 
//代练登录
 
public void login(String user, String password) {
 
this.gamePlayer.login(user, password);
 
}
 
//代练升级
 
public void upgrade() {
 
this.gamePlayer.upgrade();
 
}
 
//代理的代理暂时还没有,就是自己
 
public IGamePlayer getProxy(){
 
return this;
 
}
 
}

     
代理剧中人物也得以重新被代理,那里大家就从未继续延伸下去了,查找代理的法门就回去本人的实例。代码都写完成了,大家先根据符合规律的思路来运营一下,直接new二个实事求是角色,如代码清单12-16所示。

代码清单12-16 直接访问真正剧中人物

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Client {
 
public static void main(String[] args) {
 
//定义个游戏的角色
 
IGamePlayer player = new GamePlayer("张三");
 
//开始打游戏,记下时间戳
 
System.out.println("开始时间是:2009-8-25 10:45");
 
player.login("zhangSan", "password");
 
//开始杀怪
 
player.killBoss();
 
//升级
 
player.upgrade();
 
//记录结束游戏时间
 
System.out.println("结束时间是:2009-8-26 03:40");
 
}
 
}

      想想看能运作吧?运营结果如下所示:

起始时间是:2010-8-25 10:45

请使用内定的代理访问

请使用钦定的代理访问

请使用钦赐的代理访问

得了时间是:二零零六-8-26 03:40

     
它需求你必须透过代办来拜访,你想要直接访问它,门儿都不曾,好,你要自作者经过代理来走访,那就生产3个代理,如代码清单12-17所示。

代码清单12-17 直接访问代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Client {
 
public static void main(String[] args) {
 
//定义个游戏的角色
 
IGamePlayer player = new GamePlayer("张三");
 
//然后再定义一个代练者
 
IGamePlayer proxy = new GamePlayerProxy(player);
 
//开始打游戏,记下时间戳
 
System.out.println("开始时间是:2009-8-25 10:45");
 
proxy.login("zhangSan", "password");
 
//开始杀怪
 
proxy.killBoss();
 
//升级
 
proxy.upgrade();
 
//记录结束游戏时间
 
System.out.println("结束时间是:2009-8-26 03:40");
 
}
 
}

      这一次能访问吗?照旧12分,结果如下所示:

起来时间是:二零零六-8-25 10:45

请使用钦定的代办访问

请使用钦定的代办访问

请使用钦命的代办访问

终结时间是:2010-8-26 03:40

     
同样是不只怕访问,为啥吗?它不是实事求是角色指定的目标,这几个代理对象是你协调new出来的,当然真实对象不认了,那就好比是特别歌唱家,人家已经告诉您去找他的代办了,你随便找个代表能成吗?你不大概不去找他钦定的代理才成!大家修改一下场景类,如代码清单12-18所示。

代码清单12-18 强制代理的场景类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Client {
 
public static void main(String[] args) {
 
//定义个游戏的角色
 
IGamePlayer player = new GamePlayer("张三");
 
//获得指定的代理
 
IGamePlayer proxy = player.getProxy();
 
//开始打游戏,记下时间戳
 
System.out.println("开始时间是:2009-8-25 10:45");
 
proxy.login("zhangSan", "password");
 
//开始杀怪
 
proxy.killBoss();
 
//升级
 
proxy.upgrade();
 
//记录结束游戏时间
 
System.out.println("结束时间是:2009-8-26 03:40");
 
}
 
}

      运营结果如下:

始于时间是:2008-8-25 10:45

报到名为zhangSan 的用户 张三登录成功!

张三在打怪!

张三 又升了一级!

终止时间是:二〇〇九-8-26 03:40

     
OK,可以不奇怪访问代理了。强制代理的概念就是要从实际角色查找到代办脚色,不允许直接访问真正角色,高层模块只要调用getProxy就足以访问真正角色的兼具办法,它根本就不须求发出一个代理出来,代理的保管已经由真正剧中人物本人成功。

您爱戴的,只是你获取的奖励:经验值和钱财(只怕还有配备物品)。那才是引力,你才会去想办法,才会去拼命满足NPC的愿望。

12.4.3 代理是有本性的

     
一个类可以落成多个接口,达成差异任务的结合,那约等于说代理类不仅仅可以达成主旨接口,也得以兑现任何接口完成不一致的职分,而且代理的目的是在对象对象方法的根底上作增强,那种拉长的实质日常就是对目标对象的点子开展拦截和过滤,例如游戏代理是亟需收费的,升一流须求5元钱,那么些计算功效就是代理类的秉性,它应该在代理的接口中定义,如图12-6所示。

美高梅娱乐4858.com 6

图12-6 代理类的天性

     
增加了3个IProxy接口,其意义是统计代理的费用,否则代理集团不是亏死了,大家先来看IProxy接口,如代码清单12-19所示。

代码清单12-19 代理类的接口

1
2
3
4
5
6
7
public interface IProxy {
 
//计算费用
 
public void count();
 
}

     
仅仅2个格局,分外不难,看GamePlayerProxy来的更动,如代码清单12-20所示。

代码清单12-20 代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class GamePlayerProxy implements IGamePlayer,IProxy {
 
private IGamePlayer gamePlayer = null;
 
//通过构造函数传递要对谁进行代练
 
public GamePlayerProxy(IGamePlayer _gamePlayer){
 
this.gamePlayer = _gamePlayer;
 
}
 
//代练杀怪
 
public void killBoss() {
 
this.gamePlayer.killBoss();
 
}
 
//代练登录
 
public void login(String user, String password) {
 
this.gamePlayer.login(user, password);
 
}
 
//代练升级
 
public void upgrade() {
 
this.gamePlayer.upgrade();
 
this.count();
 
}
 
//计算费用
 
public void count(){
 
System.out.println("升级总费用是:150元");
 
}
 
}

     
达成了IProxy接口,同时在upgrade方法中调用该方式,达成花费结算,其余的类都没有其余改变,运维结果如下:

起来时间是:2008-8-25 10:45

登录名为zhangSan 的用户 张三登录成功!

张三在打怪!

张三 又升了拔尖!

晋级总开支是:150元

终结时间是:二零零六-8-26 03:40

     
好了,代理公司也赚钱了,作者的游艺也升格了,拍手叫好。代理类不仅仅是都可以有谈得来的演算方法,经常的情状下代理的任务并不一定单一,它可以结合其他的实事求是角色,也能够完成团结的天职,比如计算费用。代理类可以为真正剧中人物预处理音讯、过滤音信、新闻转载、事后处理新闻等功能,当然3个代理类,可以代办多个忠实剧中人物,并且实际角色里面可以有耦合关系,读者可以活动伸张一下。

再就是以此奖励必须是力所能及感受得到的,才有价值。

12.4.4 虚拟代理

      虚拟代理(Virual
Proxy)听着很复杂,其实非凡简单,大家只要把代理方式的通用代码稍微修改一下就改为虚拟代理,修改后的代理类如代码清单12-21所示。

代码清单12-21 虚拟代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Proxy implements Subject {
 
//要代理哪个实现类
 
private Subject subject;
 
//实现接口中定义的方法
 
public void request() {
 
//判断一下真实主题是否初始化
 
if(subject == null){
 
subject = new RealSubject();
 
}
 
subject.request();
 
}
 
}

     
在急需的时候才开端化宗旨对象,可防止止被代理对象较多而滋生的初叶化缓慢的难点,它的瑕疵就是急需在各样方法中判断核心对象是不是被成立,那就是编造代理,十二分简单。

经验值可以让您杀伤力更大如故防护力更好,金钱可以买更好的武装物品,那个在下次与怪们战斗的时候,都能直观的感触到;在网游里面,还可以被其余在线的玩家看来,成就感就更大了。

12.4.5 动态代理

     
放在最终讲的形似都以压轴大戏,动态代理就是如此,上边的章节都以三个引子,动态代理才是重点。嘛是动态代理?动态代理是在贯彻阶段不用关注代理哪个人,而在运营阶段才钦定代理那多少个目的,相对的来说,自身写代理类的方式就是静态代理。本章节的着力部分就在动态代理上,今后有1个拾叁分流行的称号叫作:面向横切面编程,也等于AOP(Aspect
Oriented
Programming),其主干就是运用了动态代理体制,既然那样首要,大家就来看看动态代理是何许完成的,还是以打游戏为例,类图修改一下以贯彻动态代理,如图12-7所示。

美高梅娱乐4858.com 7

图12-7 动态代理

     
在类图中追加了一个InvocationHanlder接口和GamePlayIH类,成效就是发出一个对象的代理对象,其中InvocationHanlder是JDK提供的动态代理接口,对被代理类的格局开展代理。大家来看程序,接口保持不变,达成类也尚未变动,请参考代码清单12-一 、12-2所示。大家来看DynamicProxy类,如代码清单12-22所示。

代码清单12-22 动态代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class GamePlayIH implements InvocationHandler {
 
//被代理者
 
Class cls =null;
 
//被代理的实例
 
Object obj = null;
 
//我要代理谁
 
public GamePlayIH(Object _obj){
 
this.obj = _obj;
 
}
 
//调用被代理的方法
 
public Object invoke(Object proxy, Method method, Object[] args)
 
throws Throwable {
 
Object result = method.invoke(this.obj, args);
 
return result;
 
}
 
}

     
其中invoke方法是接口InvocationHandler定义必须贯彻的,它做到对实在方法的调用。大家来详细讲解一下InvocationHanlder接口,动态代理是基于被代理的接口生成全数的艺术,约等于说给定2个接口,动态代理会宣称“作者曾经落到实处该接口下的有所办法了”,那各位读者想想看,动态代理怎么才能落到实处被代理接口中的方法呢?默许处境下有所的办法重回值都以空的,是的,代理已经达成它了,不过从未其他的逻辑含义,那如何是好?好办,通过InvocationHandler接口,全体办法都由该Handler来拓展处理,即全数被代理的措施都由InvocationHandler接管实际的处理职务。

      我们接下去看看场景类,如代码清单12-23所示。

代码清单12-23 动态代理的场景类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Client {
 
public static void main(String[] args) throws Throwable {
 
//定义一个痴迷的玩家
 
IGamePlayer player = new GamePlayer("张三");
 
//定义一个handler
 
InvocationHandler handler = new GamePlayIH(player);
 
//开始打游戏,记下时间戳
 
System.out.println("开始时间是:2009-8-25 10:45");
 
//获得类的class loader
 
ClassLoader cl = player.getClass().getClassLoader();
 
//动态产生一个代理者
 
IGamePlayer proxy = (IGamePlayer)Proxy.newProxyInstance(cl,new Class[]{IGamePlayer.class},handler);
 
//登录
 
proxy.login("zhangSan", "password");
 
//开始杀怪
 
proxy.killBoss();
 
//升级
 
proxy.upgrade();
 
//记录结束游戏时间
 
System.out.println("结束时间是:2009-8-26 03:40");
 
}
 
}

     
很想得到是啊?不要着急,学习是二个渐进的长河,继续看下来,笔者知道你的迷惑了。其运作结果如下:

千帆竞发时间是:二〇一〇-8-25 10:45

报到名为zhangSan 的用户 张三登录成功!

张三在打怪!

张三 又升了顶级!

终结时间是:二〇一〇-8-26 03:40

     
大家依然让代练者帮大家打游戏,然而我们既没有创立代理类,也从未兑现IGamePlayer接口,那就是动态代理。别急,动态代理可不只就好像此多内容,还有更关键的,即便大家想在玩耍登陆后发3个音信给本身,幸免账号被人盗用嘛,该怎么处理?直接修改被代理类GamePlayer?那不是三个好格局,好情势如代码清单12-24所示。

代码清单12-24 订正后的动态代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class GamePlayIH implements InvocationHandler {
 
//被代理者
 
Class cls =null;
 
//被代理的实例
 
Object obj = null;
 
//我要代理谁
 
public GamePlayIH(Object _obj){
 
this.obj = _obj;
 
}
 
//调用被代理的方法
 
public Object invoke(Object proxy, Method method, Object[] args)
 
throws Throwable {
 
Object result = method.invoke(this.obj, args);
 
//如果是登录方法,则发送信息
 
if(method.getName().equalsIgnoreCase("login")){
 
System.out.println("有人在用我的账号登陆!");
 
}
 
return result;
 
}
 
}

     
看草书部分,只要在代理中加进叁个判断就足以决定是或不是要发送音讯,运维结果如下:

开首时间是:二零零六-8-25 10:45

签到名为zhangSan 的用户 张三登录成功!

有人在用笔者的账号登陆!

张三在打怪!

张三 又升了超级!

竣事时间是:二零零六-8-26 03:40

      That’s very nice。
有人用自家的账号就发送二个音讯,然后看看自身的账号是还是不是被人盗了,极度好的艺术,那就是AOP编程,AOP编程没有采取什么新的技术,可是它对我们的规划、编码有充裕大的熏陶,对于日记、事务、权限等都足以在系统设计阶段不用考虑,而在设计后经过AOP的点子切过去。既然动态代理是这么的诱人,我们来探视通用动态代理模型,类图如图12-7所示。

美高梅娱乐4858.com 8

图12-8 动态代理通用类图

     
很简短,两条独立发展的路线,动态代理完毕代理的职分,业务逻辑Subject完毕相关的逻辑作用,两者之间没有一定的并行耦合的涉及,布告Advice从另1个断面切入,最后在高层模块也等于Client进行耦合,落成逻辑的包装职责,大家先来看Subject接口,如代码清单12-25所示。

代码清单12-25 抽象主题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface Subject {
 
//业务操作
 
public void doSomething(String str);
 
}
 
其中的doSomething是一个标示方法,可以有多个逻辑处理方法,实现类如代码清单12-25所示。
 
代码清单12-26 真实主题
 
public class RealSubject implements Subject {
 
//业务操作
 
public void doSomething(String str) {
 
System.out.println("do something!---->" + str);
 
}
 
}

      重点是大家的MyInvocationHandler,如代码清单12-27所示。

代码清单12-27 动态代理的Handler类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MyInvocationHandler implements InvocationHandler {
 
//被代理的对象
 
private Object target = null;
 
//通过构造函数传递一个对象
 
public MyInvocationHandler(Object _obj){
 
this.target = _obj;
 
}
 
//代理方法
 
public Object invoke(Object proxy, Method method, Object[] args)
 
throws Throwable {
 
//执行被代理的方法
 
return method.invoke(this.target, args);
 
}
 
}

     
格外不难,全部通过动态代理达成的点子漫天经过invokve方法调用。DynamicProxy代码如代码清单12-28所示。

代码清单12-28 动态代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class DynamicProxy<T> {
 
public static <T> T newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){
 
//寻找JoinPoint连接点,AOP框架使用元数据定义
 
if(true){
 
//执行一个前置通知
 
(new BeforeAdvice()).exec();
 
}
 
//执行目标,并返回结果
 
return (T)Proxy.newProxyInstance(loader,interfaces, h);
 
}
 
}

     
在那边插入了较多的AOP术语,在哪些地点(连接点)执行什么样表现(布告),我们在此间达成了1个简练的横切面编程,读者有经验的话可以看看AOP的布署文件就会通晓那段代码的意义了。大家来看公告Advice,约等于我们要切入的类,相比较简单,接口和促成如代码清单12-29所示。

代码清单12-29 通告接口及贯彻

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface IAdvice {
 
//通知只有一个方法,执行即可
 
public void exec();
 
}
 
public class BeforeAdvice implements IAdvice{
 
public void exec(){
 
System.out.println("我是前置通知,我被执行了!");
 
}
 
}

      最终就是看大家怎么调用了,如代码清单12-30所示。

代码清单12-30 动态代理的场景类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Client {
 
public static void main(String[] args) {
 
//定义一个主题
 
Subject subject = new RealSubject();
 
//定义一个Handler
 
InvocationHandler handler = new MyInvocationHandler(subject);
 
//定义主题的代理
 
Subject proxy = DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(),handler);
 
//代理的行为
 
proxy.doSomething("Finish");
 
}
 
}

      运维结果如下所示:

自个儿是松手文告,我被实施了!

do something!—->Finish

     
好,所有的次第都看完了,大家回过头来看看程序是怎么落到实处的。在DynamicProxy类中,大家有那样的艺术:

      this.obj = Proxy.newProxyInstance(c.getClassLoader(),
c.getInterfaces(), new MyInvocationHandler(_obj));

     
该方法是再度生成了1个目的,为何要重复生成?你要动用代理呀,注意c.getInterfaces()那句话,那是相当有趣的一句话,是说查找到此类的保有接口,然后达成接口的全体办法,当然了,方法都是空的,由哪个人具体负责接管呢?是new
MyInvocationHandler(_Obj)那一个目的,于是清楚了:三个类的动态代理类是如此的八个类,由InvocationHandler的落实类落成全部的措施,由其invoke方法接管全体办法的兑现,其动态调用进度如图12-9所示。

美高梅娱乐4858.com 9

图12-9 动态代理调用进度示意图

     
读者只怕注意到大家上述的代码还有更进一步的扩大余地,那本来了,注意看DynamicProxy类,它是3个通用类,不具有业务意义,借使大家再发生3个贯彻类是否就很有含义了啊?如代码清单12-31所示。

代码清单12-31 具体工作的动态代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class SubjectDynamicProxy extends DynamicProxy{
 
public static <T> T newProxyInstance(Subject subject){
 
//获得ClassLoader
 
ClassLoader loader = subject.getClass().getClassLoader();
 
//获得接口数组
 
Class<?>[] classes = subject.getClass().getInterfaces();
 
//获得handler
 
InvocationHandler handler = new MyInvocationHandler(subject);
 
return newProxyInstance(loader, classes, handler);
 
}
 
}

     
如此扩充今后,高层模块对代理的走访会愈来愈简便易行,如代码清单12-32所示。

代码清单12-32 场景类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Client {
 
public static void main(String[] args) {
 
//定义一个主题
 
Subject subject = new RealSubject();
 
//定义主题的代理
 
Subject proxy = SubjectDynamicProxy.newProxyInstance(subject);
 
//代理的行为
 
proxy.doSomething("Finish");
 
}
 
}

     
是还是不是越来越简明了?只怕读者就要咨询了,那样与静态代理还有如何不相同?都以须求落成叁个代理类,有分别,注意看父类,动态代理的严重性意图就是化解我们常说的“审计”难题,也就横切面编程,在不转移大家已有代码结构的情事下增强或控制目的的一言一行。

     
注意 要已毕动态代理的主要条件是:被代理类必须兑现二个接口,回顾一下刚好的解析吧。当然了,今后也有成百上千技术如CGLIB可以完成不必要接口也得以兑现动态代理的办法。

     
再次证实,以上的动态代理是2个通用代理框架,固然你想设计自身的AOP框架,完全可以在此基础上增添,大家统筹的是叁个通用代理,只要有八个接口,1个完成类,就可以应用该代理,完结代理的保有作用。

于是,尽管高质量的故事情节是StackOverflow受欢迎的一直,不过,完成的手法却是“世俗而老套”的:声望值。并且,在你的名字/头像上面,清楚的显示出来您的声望值。否则,锦衣夜行有哪些意思?

12.5 最佳实践

     
代理方式选拔的卓绝普遍,大到三个系统框架、公司平台,小到代码片段、事务处理,稍不注意就用到代理形式,或者该形式是豪门接触最多的形式,而且有了AOP大家写代理就更是简约了,有类似Spring
AOP和AspectJ那样不行优良的工具,拿来主义即可,大家还友善写代理干嘛!然而,大家可以看看源代码,尤其是调节时,只要看看类似$Proxy0那样的构造,你就活该通晓那是贰个动态代理了。

友谊指示,在念书AOP框架时,弄开始多少个名词就成:切面(Aspect)、切入点(JoinPoint)、公告(Advice)、织入(Weave)就够用了,精晓了那多少个名词,你就能够对AOP游刃有余了!

 

转自http://www.cnblogs.com/cbf4life/archive/2010/01/27/1657438.html

从未有过介绍cglib的使用,在那里作者给蛇添足:

  什么是cglib?cglib是一款尤其有力的高质量代码生成器,底层是字节码处理框架asm,cglib完毕代理不必要完毕某些接口,值必要目的类是足以被正常存续的即可:

    代理工厂完成MethodInteceptor接口,重写intecept方法(回调用,类似jdk动态代理),创制Enhacer对象(处理字节码的类),设置父类,设置回调函数,创制代理对象

 

不仅在你的名字/头像上边突显(醒目的您不理会都不行),而且,StackOverflow
还是可以发给你一个Badge,上书:某人在某领域有微微多少声望值。将荣誉感最大化。

 

接下去,StackOverflow要消除的,是何许保障那声望值是“真实”的,是索要通过着力才能获得的。

如果由此欺骗或许发水帖、穿毛衣的方法自个儿给本身加分,那么,这么些声望值就是废纸,内容品质越来越无法保险。《超人总动员》里面反派剧中人物说得好:“When
everyone hero, no one will be.” 可以“刷”出来的声望值是不值钱的。

(须要注脚的是,StackOverflow是同意你自问自答的,不仅相同给分,还可以给你个badge(勋章),鼓励提问者自身研讨探索并找到答案。)

StackOverflow
想出来二个简约却很得力的措施来保险声望的实在:任什么人都得以对您的始末作出“好”大概“差”的评论。

你想制造假的是吧,作者看见了,间接给您差评,减分!那绝不等待管理员加入,因为管理员无法有那么多日子和生命力(以及能力)去做那件事。

并且,给人差评,在StackOverflow里面,也是有badge送的,叫做Criticle!

初看上去,那样会让漫天评价连串混乱掉;可实际上运维下去,并不是那般,因为:每种人都很在乎本身的声名!那点,Taobao网的对经纪人评价连串很像:的确有人会给恶意差评或然恶意好评,但是时间一久,真相就会出去了。

StackOverflow 说,小编深信你们参预的种种人;于是,StackOverflow
拿到了信任。

 

末段,声望值直接对应着StackOverflow里面各个“福利”,那让声望值不仅仅是个雅观的数字,而有了实际上的用处。

加注释、给差评、发文章、修改外人的发问等等诸多对此情节质量建设有支持的功效,都须求相应的声望值等级才能利用。

 

当然,除此之外,StackOverflow
也应用各类技术手段来对情节质量进行支配,包罗初次回答的必读教程、对故事情节的分析(否则不让提交)、对情节的实惠分类整理等等。

 

就那样,StackOverflow
渐渐的在一群高人的保障下,利用简易却使得的点子,保险了内容的成色,越来越受到欢迎,从而使得声望值特别拿到用户的强调,形成了良性的大循环。

思考下边提到的拾壹分网站的画虎不成反类犬应用,都不曾把声望值在分明地方突显出来,难道是期望大家都当活雷锋么?

正应了那句话:商场那只看不见的手,让各样人在追求他自个儿利益的时候,无意中拉动了公共的便宜。

 

P.S.
StackOverflow,某种角度,像是以咨询和回答过招的网游,声望值就是网游里面的经验值。内容好,只可以令人来看和索取;好玩,才能令人来出席和贡献。

那是 sharepoint.stackoverflow
里面一个牛人的profile页面,看看其声望值:http://sharepoint.stackexchange.com/users/11/anders-rask
告诉笔者,你是率先眼看到她的名字,照旧率先眼观察的是那多少个1万多的声望值。

stackoverflow
里面尤其有3个版块,是搞站务咨询和投诉受理的,里面最多的题材,就是问怎么统一本身多少个账号声望值的请求(有的是相当的大心弄出来多少个账号注册了,有的是不熟知使用规则使得声望值分散在四个账号里面了),管理员也是逐一核实未来给合并处理的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注