1,观察者模式,可以实现模块化分离,添加与删除模块的便捷
2,被观察者抽象类
public abstract class Subject { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //链表保存观察者--添加,删除, protected List<Observer> observers = new ArrayList<>(); public void add(Observer observer){ observers.add(observer); } public void remove(Observer observer){ observers.remove(observer); } //通知观察者 public abstract void notifyOberver(String name); }
3,被观察者实体类1
/** * 被观察者的实体类1 * * @author lenovo * */ public class ConcreteSubject extends Subject { @Override public void notifyOberver(String name) { System.out.println("具体主题发生了变化,来自人民日报"); //实现通知所有观察者 for(Object obs : observers){ ((Observer) obs).update(name); } } }
4,被观察者实体类2
/** * 被观察者的实体类2 * * @author lenovo * */ public class ConcreteSubject2 extends Subject { @Override public void notifyOberver(String name) { System.out.println("具体主题发生了变化,中国日报"); //实现通知所有观察者 for(Object obs : observers){ ((Observer) obs).update(name); } System.out.println("List: "+observers.size()); } }
5,观察者接口
/** * 观察者接口 * * @author lenovo * */ public interface Observer { public void update(String name); }
6,观察者接口实体类1
/** * 观察者接口实体类1 * @author lenovo * */ public class Observer1 implements Observer { @Override public void update(String name) { System.out.println("观察者实体类1---"+name+"---更新了"); } }
7,观察者接口实体类2
public class Observer2 implements Observer { @Override public void update(String name) { System.out.println("观察者实体类2---"+name+"----更新了"); } }
8, 测试
public class Test { public static void main(String[] args) { //观察者实体类对象 Observer1 bObserver1 = new Observer1(); Observer2 bObserver2 = new Observer2(); //被观察者实体类1 ConcreteSubject subject = new ConcreteSubject(); subject.add(bObserver1); subject.add(bObserver2); //通知 subject.notifyOberver("老王"); //被观察者实体类2 ConcreteSubject2 subject2 = new ConcreteSubject2(); subject2.add(bObserver1); subject2.add(bObserver2); //通知 subject2.notifyOberver("老黄"); } }
9,输出结果