观察者模式
-
观察者模式的实际应用场景
-
存在问题:每次创建订单需要加新功能(如新的通知方式),则要修改原有的类,难以维护
-
违背设计模式的原则
1.单一职责:订单保存功能,杂糅了消息通知这些功能
2.开闭原则:对拓展开放,对修改关闭 -
优化方案:使用观察者模式,使创建订单和消息通知进行分离,低耦合。可以选择消息队列,spring事件机制等,也可以选择自定义
-
-
创建一个观察者的接口类
public interface Observer { public void update(String message); }
-
创建一个被观察者的接口类
public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver();
-
创建一个观察者的实现类
public class User implements Observer { private String name; private String message; public User(String name){ this.name=name; } @Override public void update(String message) { System.out.println(name+"收到消息"+message); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
-
创建一个被观察者的实现类
public class OrderService implements Observed { private List<Observer> list; private String message; public OrderService(){ list =new ArrayList<Observer>(); } @Override public void registerObserver(Observer o) { list.add(o); } @Override public void removeObserver(Observer o) { list.remove(o); } @Override public void notifyObserver() { for (Observer observer:list){ observer.update(message); } } public void setMessage(String message) { this.message = message; notifyObserver(); } }
-
创建一个测试类
public class Test { public static void main(String[] args) { User userxiaohong = new User("xiaohong"); User userdahang = new User("dahang"); User userxiaowang = new User("xiaowang"); OrderService orderService = new OrderService(); orderService.registerObserver(userxiaohong); orderService.registerObserver(userdahang); orderService.registerObserver(userxiaowang); orderService.setMessage("php是世界上最好的语言"); System.out.println(); orderService.removeObserver(userxiaowang); orderService.setMessage("php是世界上最好的语言"); }
}
-
有人广播了php是世界上最好的语言,小王听不下去了,他取消了订阅,所以他接收不了消息
-
结果
xiaohong收到消息php是世界上最好的语言 dahang收到消息php是世界上最好的语言 xiaowang收到消息php是世界上最好的语言 xiaohong收到消息php是世界上最好的语言 dahang收到消息php是世界上最好的语言
网友评论