英雄聯盟我想你們都玩過吧,那麼你們都應該知道,英雄聯盟有個觀戰模式,咱們通常叫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
歡迎轉載,請註明出處跟做者,謝謝!方法