23种设计模式:观察者模式
观察者模式
1.介绍
概念
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
主要作用
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
解决的问题
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
使用场景
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
(引用自菜鸟教程)
2.实现
背景
一家公司里面有许多员工正在摸鱼,一个观察者发现老板来了,就马上通知所有人,员工们马上开始努力工作。
实现步骤
1.创建观察者类。
public class Observer {
//观察者数组
private ArrayList<Staff> staffList = new ArrayList<>();
//增加第一个观察者
public void addStaff(Staff staff) {
this.staffList.add(staff);
}
//删除第一个观察者
public void removeStaff(Staff staff) {
this.staffList.remove(staff);
}
//通知所有观察者
public void notifyStaff() {
for (Staff staff : staffList) {
staff.update();
}
}
}
2.创建员工接口。
public interface Staff {
//更新
void update();
}
3.创建观察者的子类。
public class ObserverStaff extends Observer{
public void doSomething() {
System.out.println("老板来了!");
super.notifyStaff();
}
}
4.创建员工接口的实现类。
public class StaffOfThisCompany implements Staff{
@Override
public void update() {
System.out.println("收到,停止摸鱼!");
}
}
4.创建测试类
public class ObserverPatternDemo {
public static void main(String[] args) {
Staff staff1 = new StaffOfThisCompany();
Staff staff2 = new StaffOfThisCompany();
Staff staff3 = new StaffOfThisCompany();
ObserverStaff observer = new ObserverStaff();
observer.addStaff(staff1);
observer.addStaff(staff2);
observer.addStaff(staff3);
observer.doSomething();
}
}
5.运行结果
老板来了!
收到,停止摸鱼!
收到,停止摸鱼!
收到,停止摸鱼!