設計模式(18):JAVA(18):設計模式(11)觀察者模式 觀察者模式:被觀察者發生變化時,所有被觀察者都會通知
阿新 • • 發佈:2021-09-04
如題,我們先抽象出被觀察者和觀察者
/** *抽象觀察者 */ abstract class obServer { protected String name; public obServer(String name) { this.name = name; } protected SubJect subJect; //更新介面 public abstract void updata(); //不在觀察 public abstract void dontLook(SubJect subJect); }
/** *抽象被觀察者*/ abstract class SubJect{ //所有觀察者 private List<obServer> obServerList=new ArrayList<>(); //狀態 private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } //新增觀察者 public void attach(obServer obServer){ obServerList.add(obServer); System.out.println("新增觀察者:"+obServer.name); } //刪除觀察者 public void deletObServer(obServer obServer){ obServerList.remove(obServer); System.out.println("移除觀察者:"+obServer.name); } //更新觀察者 public void updateObServer(){ for (obServer o:obServerList) { o.updata(); } } }
有一檔電視節目來當實體(被觀察者)
class TVPlay extends SubJect{ private String theTVSet; public String getTheTVSet() { return theTVSet; } public void setTheTVSet(String theTVSet) { this.theTVSet = theTVSet; } public void play(){ System.out.println("電視劇開播了!今日節目:"+ theTVSet); //通知觀察者 updateObServer(); } }
人實體來充當觀察者
class People extends obServer{ public People(String name) { super(name); } @Override public void updata() { System.out.println(name+"收到電視劇開播通知"); } @Override public void dontLook(SubJect subJect) { subJect.deletObServer(this); } }
執行時,被觀察者會檢查所有觀察者,去呼叫play下發通知
public static void main(String[] args) { TVPlay tvPlay = new TVPlay(); People man = new People("男人"); People woman = new People("女人"); tvPlay.attach(man); tvPlay.attach(woman); tvPlay.setTheTVSet("宮鎖心玉"); tvPlay.play(); System.out.println("新的一期開始了!"); System.out.println("上次不好看,男人取消了觀察"); man.dontLook(tvPlay); tvPlay.setTheTVSet("宮鎖心玉2"); tvPlay.play(); }
本文來自部落格園,作者:秋華,轉載請註明原文連結:https://www.cnblogs.com/qiu-hua/p/15227569.html