观察者模式

原创
2017/07/16 00:17
阅读数 285

英雄联盟我想大家都玩过吧,那么大家都应该知道,英雄联盟有个观战模式,我们一般叫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类图

 

 

 

到这,文章就结束了!

以上,均为本人个人理解,比较简单的理解,或许跟各位看官理解的有出入,欢迎指正交流

欢迎转载,请注明出处跟作者,谢谢!

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
1
分享
返回顶部
顶部