黑马程序员技术交流社区

标题: 【黑马程序员济南】JDK中自带的观察者模式演示 [打印本页]

作者: 大山哥哥    时间: 2017-7-25 17:34
标题: 【黑马程序员济南】JDK中自带的观察者模式演示
本帖最后由 大山哥哥 于 2017-7-25 17:42 编辑

本次内容是由监听器所联想到的观察者设计模式的小DEMO.       有一个美女博主(butty)开放了自己的博客,引来很多人的关注,其中两个粉丝分别名为屌丝(Ugly)和帅哥(Handsome)。
       当她更新状态的时候,比如发布“人家感冒啦~”,这两个粉丝会分别看到这条状态并进行回复。但是屌丝回复的毫无情调,后期被美女踢掉啦,只剩下帅哥能看到美女的状态更新。

[Java] 纯文本查看 复制代码
/**
* 美丽的博主ButtyBlogger[被关注的对象]
* 被观察者类,它继承java.util.Observable类
*/
public class ButtyBlogger extends Observable{
        
        @Override
        /**
         * 重写notifyObservers(通知观察者)方法。
         * 在后台打印美女状态信息,同时更新当前博客状态为true,并将信息广播通知粉丝
         *
         */
        public void notifyObservers(Object message) {
                System.out.println("美女博主发状态:" + message);
                setChanged();//将被观察者的状态改为true,才会通知观察者数据有变化
                super.notifyObservers(message);//通知所有的粉丝观看状态
        }
}
       1. 首先准备一个公共类(普通博客用户-观察者),规定博客用户有关注和评论的功能
[Java] 纯文本查看 复制代码
/**
* [观察者]微博用户有关注功能[attentionBlogger]以及评论功能[update]
* 观察者父类,它实现java.util.Observer接口
*/
public class BloggerObserver implements Observer {
        /**
         * 关注某个博主
         * 本质是,被观察者将观察者收入囊中(保存到一个集合中)
         */
        public void attentionBlogger(Observable blogger){
                blogger.addObserver(this);//this表示当前调用该方法的对象
        }

        @Override
        public void update(Observable o, Object arg) {
                System.out.println("好评!");
        }
}

      2. 有请屌丝博客用户出场
[Java] 纯文本查看 复制代码
/**
* [观察者1]屌丝观察者
*/
public class UglyObserver extends BloggerObserver{
        /**
         * 重写父类的评论功能,根据不同的消息反馈不同的评论
         */
        @Override
        public void update(Observable o, Object arg) {
                System.out.print("屌丝回复:");
                if("人家感冒啦~".equals((String)arg)){
                        System.out.println("多喝热水!!!!");
                }else{
                        System.out.println(".喝热水……");
                }
        }
}

       3. 有请帅哥登场
[Java] 纯文本查看 复制代码
/**
* [观察者2]帅哥观察者
*/
public class HandsomeObserver extends BloggerObserver {
        @Override
        public void update(Observable observable, Object arg) {
                System.out.print("帅哥回复:");
                if("人家感冒啦~".equals(arg)){
                        System.out.println("你在哪 我去给你送药吧~~然后x..");
                }else{
                        System.out.println("我又帅又温柔");
                }
        }
}
[Java] 纯文本查看 复制代码
public class BlogTest {
        public static void main(String[] args) {
                //美女博主开放微博了。
                Observable butty = new ButtyBlogger();
               
                //丑的观察者也注册了微博,并发现了美女博主,要进行关注
                BloggerObserver ugly = new UglyObserver();
                ugly.attentionBlogger(butty);
               
                //帅气的观察者发现了美女博主,也要进行关注
                BloggerObserver handsome = new HandsomeObserver();
                handsome.attentionBlogger(butty);
               
                //美女博主发布动态啦【此过程会触发该被观察者(美女博主)的关注者对象中的update方法】
                butty.notifyObservers("人家感冒啦~");
                //
                System.out.println("----------------------------------");
                butty.notifyObservers("今晚402~");
               
                //美女主播觉得屌丝太不解风情了,只知道喝热水,果断踢掉
                butty.deleteObserver(ugly);
               
                System.out.println("----------------------------------");
                //美女博主再次发布动态啦
                butty.notifyObservers("刚起床");
        }
}

[Java] 纯文本查看 复制代码
美女博主发状态:人家感冒啦~
帅哥回复:你在哪 我去给你送药吧~~然后x..
屌丝回复:多喝热水!!!!
----------------------------------
美女博主发状态:今晚402~
帅哥回复:我又帅又温柔
屌丝回复:.喝热水……
----------------------------------
美女博主发状态:刚起床
帅哥回复:我又帅又温柔


搞定~


作者: 溜溜溜溜溜    时间: 2017-7-28 10:30
System。exit(0)
作者: fashionkillyou    时间: 2018-1-24 10:14
while(true){
    System.out.println(6);
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2