本帖最后由 大山哥哥 于 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~
帅哥回复:我又帅又温柔
屌丝回复:.喝热水……
----------------------------------
美女博主发状态:刚起床
帅哥回复:我又帅又温柔
搞定~
|