英雄联盟我想大家都玩过吧,那么大家都应该知道,英雄联盟有个观战模式,我们一般叫OB视角,那么它是怎么做到玩家有击杀的时候,OB视角也能收到通知呢,下面就是我要介绍的观察者模式,
-------------------------------分割线------------------------------------------
首先,我们定义一个观察者的接口,就一个方法 print() ,打印击杀英雄的情况
public interface ObClient {
//打印主题传递过来的信息
void print(String msg);
}
然后在定义一个实现类,定义一个2个字段,name是观察者的名称,ObSubject是主题接口,作用是订阅主题,将自己注册到主题接口中,当主题发生变化的使用,能及时通知自己,也可构建的时候不订阅主题,
public class ObPeople implements ObClient {
private String name;
private ObSubject obSubject;
public ObPeople(String name) {
this.name = name;
}
public ObPeople(String name, ObSubject obSubject) {
this.name = name;
this.obSubject = obSubject;
//订阅主题,将自己注册到主题当中,也可以不注册
obSubject.registObSubject(this);
}
@Override
public void print(String msg) {
System.out.print("观察者"+this.name+"打印:");
System.out.println(msg);
}
}
然后我们定义一个主题接口,接口三个方法,分别是将观察者注册到观察者列表中,将观察者移除出观察者列表,发送广播给所有观察者
public interface ObSubject {
//订阅主题
void registObSubject(ObClient obClient);
//取消订阅
void removeObSubject(ObClient obClient);
//发布消息给订阅者
void notifyObClient(String msg);
}
然后定义一个实现类,实现三个方法
public class KillSubject implements ObSubject{
private List<ObClient> obClients = new ArrayList<>();
@Override
public void registObSubject(ObClient obClient) {
obClients.add(obClient);
}
@Override
public void removeObSubject(ObClient obClient) {
obClients.remove(obClient);
}
@Override
public void notifyObClient(String msg) {
for (ObClient obClient : obClients) {
obClient.print(msg);
}
}
public void display(String msg) {
System.out.println("主题打印:"+msg);
notifyObClient(msg);
}
}
观察者,主题都有了,我们需要一个UZI,如果玩家击杀了英雄,看看观察者会不会收到订阅的消息
public class UZI {
public static void main(String[] args){
KillSubject kill = new KillSubject();
for (int i = 0; i < 5; i++) {
new ObPeople(i+"",kill);
}
kill.display("UZI击杀了Faker,完成了单杀");
kill.display("UZI击杀了Duke,完成了双杀");
kill.display("UZI击杀了Blank,完成了三杀");
kill.display("UZI击杀了Bang,完成了四杀");
kill.display("UZI击杀了Wolf,完成了五杀");
}
}
执行UZI的方法,默认我们会让观察者订阅主题,注册到主题中的注册列表中.这样,当UZI击杀英雄的时候,作为观察者,就能及时收到主题的变化,下面就是UML类图
到这,文章就结束了!
以上,均为本人个人理解,比较简单的理解,或许跟各位看官理解的有出入,欢迎指正交流
欢迎转载,请注明出处跟作者,谢谢!