概述
观察者模式是一种比较常见的模式,某些事件发生时,如果一个对象需要自动地通知其他多个对象时就会采用该方案。
观察者模式分4步进行:
1、写一个观察者接口,他将不同的观察者聚合在一起;
2、声明不同的观察者,依据不同的需求定义不同的行为;
3、定义另一个接口Subject,该接口包含两个抽象方法。一个用来注册观察者,另一个用来向观察者发送消息;
4、“喂狗”类实现Sbject接口中的抽象方法,另外还需要维护一个观察者列表。虽然干了互联网,还是喜欢嵌入式的这个叫法,比较贴切。
举个例子说明下:BAT三家互联网公司服务大众的例子来说明观察者模式。
//统一的观察者接口,作用类似于文化认同,不论你姓张还是姓李,都认同自己是中国人
public interface Observer {
//接口中只有一个抽象方法,这是一个函数式接口
void notify(String news);
}
//百度就是BAT中的一家企业,负责某项服务
public class BaiDu implements Observer {
@Override
public void notify(String news) {
// TODO Auto-generated method stub
if(news != null && news.contains("百度地图")) {
System.out.println("BaIDu is servering!");
}
}
}
public class ALiBaBa implements Observer {
@Override
public void notify(String news) {
// TODO Auto-generated method stub
if(news != null && news.contains("支付宝")) {
System.out.println("ALiBaBA is servering!");
}
}
}
public class TengXun implements Observer {
@Override
public void notify(String news) {
// TODO Auto-generated method stub
if(news != null && news.contains("王者荣耀!")) {
System.out.println("TengXun is servering!");
}
}
}
//包含两个部分,注册和通知
public interface Subject {
//注册的抽象方法
void registerObserver(Observer companyName);
//通知---发送消息的抽象方法
void notifyObserver(String newsComing);
}
import java.util.ArrayList;
import java.util.List;
/*
* 测试类包装方法的传递方法和直接使用Lambda表达式传递代码块
* 感受二者的区别,前者多写了很多implments观察者接口的类,后者省略多余的类,直接传递有效代码
* Lambda表达式并不是万能的,适用于简单的“动作”,当涉及的观察者逻辑复杂时,还是要老老实实使用类进行
* 封装。
* **/
public class FeedCompany implements Subject {
//这个类中维护一个观察者列表
private final List<Observer> observers = new ArrayList<>();
@Override
public void registerObserver(Observer companyName) {
// TODO Auto-generated method stub
observers.add(companyName);
}
@Override
public void notifyObserver(String newsComing) {
// TODO Auto-generated method stub
//这里应用了forEach技术和Lambda表达式---简单有效地实现遍历和方法传递,威力初现
observers.forEach(O -> O.notify(newsComing));
}
//测试:观察者设计模块
public static void main(String[] args) {
FeedCompany feedCompany = new FeedCompany();
//注册
feedCompany.registerObserver(new BaiDu());
feedCompany.registerObserver(new ALiBaBa());
//feedCompany.registerObserver(new TengXun());
//通知
feedCompany.notifyObserver("支付宝");
//但是等一等我们为什么累赘的写了3个类,分别取实现接口Observer?
//这几个家伙貌似做了类似的事情,判断传入的消息是否包含设定的关键字,然后给出一行打印。
//其实这三个家伙不过是将想干的事情封装进类中,然后利用类去传递方法
//现在我们不进行封装,直接传递方法---Lambda表达式出现的初衷
feedCompany.registerObserver((String newsComing) -> {
if(newsComing != null && newsComing.contains("王者荣耀")) {
System.out.println("TengXun is servering");
}
});
feedCompany.notifyObserver("王者荣耀");
}
}
运行结果:
ALiBaBA is servering!
TengXun is servering
最后
以上就是端庄摩托为你收集整理的设计模式之观察者模式总结的全部内容,希望文章能够帮你解决设计模式之观察者模式总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复