观察者模式(UML)应用

 

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,输出结果

posted @ 2020-06-08 17:00  maigao  阅读(1225)  评论(0编辑  收藏  举报