自定义观察者设计模式: 案例代码演示: 定义SalaryManger 管理 类
说明: 为了确保Salary 类只有一个实例,. 我们采用单例设计模式中的双重检查加锁模式保证它只有一个实例.
public class SalaryManger {
private static SalaryManger instance;
private SalaryManger() {}
public static SalaryManger getInstance() {
//双重检查加锁机制
if (instance == null) {
synchronized (SalaryManger.class) {
if (instance == null) {
instance = new SalaryManger();
}
}
}
return instance;
}
interface SalaryObserver{
void GetSalaryInfoChanged(int monkey);
}
//定义集合保存 接口对象
public List<SalaryObserver> observers = new ArrayList<>();
//常见方法-->添加观察者到观察者集合中
public synchronized void addObserver(SalaryObserver o) {
if (o == null)
throw new NullPointerException();
if (!observers.contains(o)) {
observers.add(o);
}
}
//常见方法-->从观察者集合中移除观察者
public synchronized void deleteObserver(SalaryObserver o) {
observers.remove(o);
}
//常见方法-->通知所有的观察者消息已经发生改变
public void notifyObservers(int money) {
// LogUtils.s("observers.size-->"+observers.size());
for (SalaryObserver o : observers) {
o.GetSalaryInfoChanged(money);
}
}
}
定义: 两个观察者类 StaffOne StaffTwo 实现观察者接口,重写方法 StaffOne 类
public class StaffOne implements SalaryObserver{
@Override
public void GetSalaryInfoChanged(int monkey) {
// TODO Auto-generated method stub
System.out.println(StaffOne.class.getSimpleName()+"的薪水是"+monkey);
}
}
StaffTwo 类
public class StaffTwo implements SalaryObserver{
@Override
public void GetSalaryInfoChanged(int monkey) {
// TODO Auto-generated method stub
System.out.println(StaffTwo.class.getSimpleName()+"的薪水是"+monkey);
}
}
定义测试类Boss
public class Boss {
public static void main(String[] args) {
SalaryManger msalary=new SalaryManger();
msalary.addObserver(new StaffOne());
msalary.addObserver(new StaffTwo());
msalary.notifyObservers(10000);
}