A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大山哥哥 于 2017-7-25 17:42 编辑

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

  • 准备被观察者-美女博主【ButtyBlogger】
[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~
帅哥回复:我又帅又温柔
屌丝回复:.喝热水……
----------------------------------
美女博主发状态:刚起床
帅哥回复:我又帅又温柔


搞定~

2 个回复

倒序浏览
System。exit(0)
回复 使用道具 举报
while(true){
    System.out.println(6);
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马