觀察者模式

英雄聯盟我想你們都玩過吧,那麼你們都應該知道,英雄聯盟有個觀戰模式,咱們通常叫OB視角,那麼它是怎麼作到玩家有擊殺的時候,OB視角也能收到通知呢,下面就是我要介紹的觀察者模式,

 

-------------------------------分割線------------------------------------------java

 

首先,咱們定義一個觀察者的接口,就一個方法 print() ,打印擊殺英雄的狀況ide

 

public interface ObClient {
	//打印主題傳遞過來的信息
	void print(String msg);
}

 

而後在定義一個實現類,定義一個2個字段,name是觀察者的名稱,ObSubject是主題接口,做用是訂閱主題,將本身註冊到主題接口中,當主題發生變化的使用,能及時通知本身,也可構建的時候不訂閱主題,this

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);
	}
}

 

而後咱們定義一個主題接口,接口三個方法,分別是將觀察者註冊到觀察者列表中,將觀察者移除出觀察者列表,發送廣播給全部觀察者spa

public interface ObSubject {

	//訂閱主題
	void registObSubject(ObClient obClient);

	//取消訂閱
	void removeObSubject(ObClient obClient);

	//發佈消息給訂閱者
	void notifyObClient(String msg);

}

 

 

而後定義一個實現類,實現三個方法code

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類圖rem

 

 

 

到這,文章就結束了!class

以上,均爲本人我的理解,比較簡單的理解,或許跟各位看官理解的有出入,歡迎指正交流List

歡迎轉載,請註明出處跟做者,謝謝!方法

相關文章
相關標籤/搜索