设计模式一观察者模式

观察者模式

观察者(Observer)模式的定义:
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,
所有依赖于它的对象都得到通知并被自动更新
这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

抽象主题(Subject)角色:
也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,
以及通知所有观察者的抽象方法。
具体主题(Concrete Subject)角色
也叫具体目标类,它实现抽象目标中的通知方法,
当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
抽象观察者(Observer)角色:
它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
具体观察者(Concrete Observer)角色:
实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class Observer {
 5     public static void main(String[] args) {
 6         Subjecting sub = new ConcreteSubject();
 7         sub.add(new Observering1());
 8         sub.add(new Observering2());
 9         ((ConcreteSubject) sub).change("变天啦");
10     }
11 }
12 
13 //首先是一个被观察者的父类,它维护了装有观察者引用集合的功能。
14 abstract class Subjecting {
15     //观察者集合
16     private List<Observering> arr = new ArrayList<Observering>();
17 
18     public void add(Observering ob) {
19         arr.add(ob);
20     }
21 
22     public void remove(Observering ob) {
23         arr.remove(ob);
24     }
25 
26     //通知观察者
27     public void update(String newstatue) {
28         for (int i = 0; i < arr.size(); i++) {
29             Observering observering = arr.get(i);
30             observering.update(newstatue);
31         }
32     }
33 }
34 
35 //具体的被观察者对象
36 class ConcreteSubject extends Subjecting {
37     private String statue;
38 
39     public String getStatue() {
40         return statue;
41     }
42 
43     public void setStatue(String statue) {
44         this.statue = statue;
45     }
46 
47     public void change(String statuee) {
48         statue = statuee;
49         update(statuee);
50     }
51 }
52 
53 //观察者
54 interface Observering {
55     public void update(String statue);
56 }
57 
58 class Observering1 implements Observering {
59     private String statue;
60 
61     @Override
62     public void update(String statuee) {
63         statue = statuee;
64         System.out.println(statuee + "---快走");
65     }
66 }
67 
68 class Observering2 implements Observering {
69     private String statue;
70 
71     @Override
72     public void update(String statuee) {
73         statue = statuee;
74         System.out.println(statuee + "--快----跑---");
75     }
76 }

猜你喜欢

转载自www.cnblogs.com/loveer/p/11279698.html