观察者模式
观察者模式:也叫订阅模式或发布模式,使得对象间相互对话。
假设用户界面是观察者,业务数据是被观察者,当数据变化时会通知界面,
界面会做出相应的修改和变化。
作用:提供了组件之间紧密联系地一种方式,将观察者与被观察的对象分开。
具体实现:一个对象添加一个方法(允许观察者注册自己),使得本身变得可以观察。
//问题:观察者收到消息后所执行的操作与观察的对象无关?
比如实现天气预报的主要功能,同样的天气预报有不同的显示方式。
<interface> <interface>
Subject Observer
——————— ———————
+addObserver() ————> +update()
+removeObserver() |
+notifyObservers() |
| |
|
| ConcretSubject
ConcretSubject
实现增删观察者,通知观察者对象 实际观察者
思路:
import java.util.ArrayList; interface Subject{ public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver(); } class Whether implements Subject{ private ArrayList<Observer>observers=new ArrayList<Observer>(); private float temperature; @verride ... @verride ... @verride ... //重写Subject中的三个方法 //更改、设置、并通知观察者对象 } interface Observer{ public void update(float temp); } class WhetherDisplay1 implements Observer{ … //参数传递进来并修改 @verride ... //重写update方法并打印显示 } class WhetherDisplay2 implements Observer{ private float temperature; public WhetherDisplay2(Subject whether){ whether.registerObserver(this); @verride ... //重写update方法并打印显示 } public class Test{ public static void main(String[] args) { Whether whether=new Whether(); WhetherDisplay1 d1=new WhetherDisplay1(); WhetherDisplay2 d2=new WhetherDisplay2(); whether.setTemperature(27); whether.setTemperature(26); } }
海量数据处理
题目:有一个10亿条记录的文本文件,已按照关键字拍好序存储,请设计一个算法,
可以从文件中快速查找指定的记录。
答:10亿条记录的数据量较大,无法一次读入内存,所以要把它分成100份,
把第一条记录关键字和此记录对应的文件偏移量先扫入内存,定位出指定关键字的
记录块,把相应的记录块拿到内存,用二分法即可。
//文件偏移量:指从指定位置向前或向后移动的字节数,偏移量是用来从文件中找到所用数据时用的。