美文网首页Java8 Lambda
Java8 Lambda表达式+观察者模式

Java8 Lambda表达式+观察者模式

作者: 依然慢节奏 | 来源:发表于2019-11-13 10:22 被阅读0次
image image.gif

/**
 * 观察者模式是一种比较常见的方案,某些事件发生时(比如状态转变),如果一个对象(通
 * 常我们称之为主题)需要自动地通知其他多个对象(称为观察者),就会采用该方案。创建图形
 * 用户界面(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));
    }
}
image.gif
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);
        }
    }
}

image.gif
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!");
    }
}
image.gif

相关文章

网友评论

    本文标题:Java8 Lambda表达式+观察者模式

    本文链接:https://www.haomeiwen.com/subject/yhchictx.html