黑马程序员技术交流社区
标题:
【黑马程序员济南】JDK中自带的观察者模式演示
[打印本页]
作者:
大山哥哥
时间:
2017-7-25 17:34
标题:
【黑马程序员济南】JDK中自带的观察者模式演示
本帖最后由 大山哥哥 于 2017-7-25 17:42 编辑
本次内容是由监听器所联想到的观察者设计模式的小DEMO.
首先说明应用场景【以博客为例】:
有一个美女博主(butty)开放了自己的博客,引来很多人的关注,其中两个粉丝分别名为屌丝(Ugly)和帅哥(Handsome)。
当她更新状态的时候,比如发布“人家感冒啦~”,这两个粉丝会分别看到这条状态并进行回复。但是屌丝回复的毫无情调,后期被美女踢掉啦,只剩下帅哥能看到美女的状态更新。
准备被观察者-美女博主【ButtyBlogger】
[mw_shl_code=java,true]/**
* 美丽的博主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);//通知所有的粉丝观看状态
}
}[/mw_shl_code]
准备观察者
1.
首先准备一个公共类(普通博客用户-观察者),规定博客用户有关注和评论的功能
[mw_shl_code=java,true]/**
* [观察者]微博用户有关注功能[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("好评!");
}
}[/mw_shl_code]
2.
有请屌丝博客用户出场
[mw_shl_code=java,true]/**
* [观察者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(".喝热水……");
}
}
}[/mw_shl_code]
3.
有请帅哥登场
[mw_shl_code=java,true]/**
* [观察者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("我又帅又温柔");
}
}
}[/mw_shl_code]
测试
[mw_shl_code=java,true]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("刚起床");
}
}[/mw_shl_code]
测试后台打印
[mw_shl_code=java,true]美女博主发状态:人家感冒啦~
帅哥回复:你在哪 我去给你送药吧~~然后x..
屌丝回复:多喝热水!!!!
----------------------------------
美女博主发状态:今晚402~
帅哥回复:我又帅又温柔
屌丝回复:.喝热水……
----------------------------------
美女博主发状态:刚起床
帅哥回复:我又帅又温柔
[/mw_shl_code]
搞定~
作者:
溜溜溜溜溜
时间:
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