之前用观察者模式用的最多的是回调。安卓读卡成功之后返回Activity界面继续执行之后的逻辑。
但是严格意义上说回调是1对1 观察者模式是1对多的关系。
以国庆节电影《万里归途》来做一个模拟
比如张三和李四两个人都想要购买万里归途的电影票。如果发售时给两个人发送通知。
示例代码:
/*** * 电影票接口 */ public interface Ticket { void regisObserver(Observer observer);//注册观察者 void removeObserver(Observer observer);//移除观察者 void notice();//通知 }
/*** * 万里归途电影票 */ public class WanLiGuiTU implements Ticket { List<Observer> observers = new ArrayList<>(); @Override public void regisObserver(Observer observer) { if(!observers.contains(observer)){ observers.add(observer); } } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notice() { for(Observer observer : observers){ observer.update(); } } }
/*** * 观察者 */ public interface Observer { void update();//更新电影票之后的操作 }
public class Observer1 implements Observer{ Ticket ticket; Observer1(){} Observer1(Ticket ticket){ this.ticket = ticket; this.ticket.regisObserver(this); } @Override public void update() { System.out.println("观察者1得到通知:可以购买万里归途的电影票了"); } }
public class Observer2 implements Observer{ Ticket ticket; Observer2(){} Observer2(Ticket ticket){ this.ticket = ticket; this.ticket.regisObserver(this); } @Override public void update() { System.out.println("观察者2得到通知:可以购买万里归途的电影票了"); } }
public class Test { public static void main(String[] args) { Ticket ticket = new WanLiGuiTU(); Observer1 observer1 = new Observer1(ticket); Observer2 observer2 = new Observer2(ticket); ticket.notice(); } }