/**
* 观察者模式是一种比较常见的方案,某些事件发生时(比如状态转变),如果一个对象(通
* 常我们称之为主题)需要自动地通知其他多个对象(称为观察者),就会采用该方案。创建图形
* 用户界面(GUI)程序时,你经常会使用该设计模式。这种情况下,你会在图形用户界面组件(比
* 如按钮)上注册一系列的观察者。如果点击按钮,观察者就会收到通知,并随即执行某个特定的
* 行为。 但是观察者模式并不局限于图形用户界面。比如,观察者设计模式也适用于股票交易的
* 情形,多个券商可能都希望对某一支股票价格(主题)的变动做出响应。
*/
public interface Subject {
/**注册一个新的观察者*/
void registerObserver(Observer o);
/**通知它的观察者一个新闻的到来*/
void notifyObserver(String tweet);
}
class Feed implements Subject{
private final List<Observer> observers = CollUtil.newArrayList();
/**
* 注册一个新的观察者
*
* @param o 观察者
*/
@Override
public void registerObserver(Observer o) {
this.observers.add(o);
}
/**
* 通知它的观察者一个新闻的到来
*
* @param tweet 消息
*/
@Override
public void notifyObserver(String tweet) {
observers.forEach(o->o.notify(tweet));
}
}
public interface Observer {
void notify(String tweet);
}
class NYTimes implements Observer{
@Override
public void notify(String tweet) {
if(tweet!=null && tweet.contains("money")){
System.out.println("Breaking news in NY! " + tweet);
}
}
}
class Guardian implements Observer{
@Override
public void notify(String tweet) {
if(tweet!=null && tweet.contains("queen")){
System.out.println("Yet another news in London... " + tweet);
}
}
}
class LeMonde implements Observer{
@Override
public void notify(String tweet) {
if(tweet!=null && tweet.contains("wine")){
System.out.println("Today cheese,wine and news!! " + tweet);
}
}
}
public class FeedTest {
@Test
public void registerObserver() {
///java8以前写法
Feed f = new Feed();
f.registerObserver(new NYTimes());
f.registerObserver(new Guardian());
f.registerObserver(new LeMonde());
f.notifyObserver("The queen said her favourite book is java 8 in action!");
///java8 lambda表达式
f.registerObserver(tweet -> {
if(tweet!=null && tweet.contains("book")){
System.out.println("Point book->" + tweet);
}
});
f.registerObserver(tweet -> {
if(tweet!=null && tweet.contains("java")){
System.out.println("jdk->" + tweet);
}
});
f.notifyObserver("The queen said her favourite book is java 8 in action!");
}
}