设计模式-观察者模式自我理解

来源:互联网 发布:mac炒股软件哪个好 编辑:程序博客网 时间:2024/05/16 02:35

观察者模式:顾名思义就会有观察者和被观察者,它的意思就是被观察者发生变化,会立即通知观察者被观察者已经发生了变化做出相应对策。

观察者模式也叫发布-订阅模式,说白了就是观察者时刻监听被观察者的变化,它是一个一对多的依赖关系。

用java语言我自己写一个观察者的例子,以便自己理解!!!

那么这个例子内容就是:X名男孩和1名女孩的故事,男孩们都关心女孩的心情,如果女孩的心情好的话,男孩们会打电话给她,如果女孩的心情不好的话,男孩们犹豫是否要打电话给这个女孩。

我们分析这个案例:女孩被关注的对象应该是被观察者,男孩们关注女孩的心情应该是观察者。那么观察者在监听到被观察者的变化后会根据观察者的变化做出相应的对策,这里我们可以提炼出一个观察者的统一方法行为:update,也就是根据被观察者的变化更新自己的行为。那么被观察者当然希望被观察者所关注,可以添加观察者、移除观察者、告知所有的观察者自己心情变化,告知“特殊”观察者自己心情变化,从而这里我们可以将被观察者提炼出4个统一方法:addManObserver、removeAllManObserver、notifiAllManObserver、notifiAllManObserver。

下面我们编写被观察者女孩的程序代码:

被观察者统一方法代码:

package com.lgy.observer;/** * 女孩被观察者身份,所拥有的所有共同行为方法 */public interface GirlObserved {/** * 添加一个男观察者 * @param observer */void addManObserver(ManObserver observer);/** * 移除一个男观察者 * @param observer */void removeManObserver(ManObserver observer);/** * 通知所有的男观察者 */void notifiAllManObserver();/** * 通知特定的男观察者 * @param observer */void notifiAllManObserver(ManObserver observer);/** * 移除所有的男观察者 */void removeAllManObserver();}
被观察者女孩对象具体实现:
<pre name="code" class="java">package com.lgy.observer;import java.util.ArrayList;/** * 女孩的心情好坏,通知关心她的男孩们  * 这个例子就是很好的观察者模式,也就是一对多的依赖关心。 * 那么我们分析女孩应该是被观察者,男孩就应该是观察者。 */public class GirlPerson implements GirlObserved{private String name;//女孩名字private String phone;//女孩的手机号private Boolean isGood;//女孩心情true表示心情不错,false表示心情糟糕/** * 存放所有观察者的集合容器 */private ArrayList<ManObserver> list;public GirlPerson(String name,String phone,Boolean isGood) {list = new ArrayList<ManObserver>();this.name = name;this.phone = phone;this.isGood = isGood;}@Overridepublic void addManObserver(ManObserver observer) {list.add(observer);}@Overridepublic void removeManObserver(ManObserver observer) {list.remove(observer);}@Overridepublic void notifiAllManObserver() {for (int i = 0; i < list.size(); i++) {list.get(i).update(this);}}@Overridepublic void notifiAllManObserver(ManObserver observer) {if(list.contains(observer)){for (int i = 0; i < list.size(); i++) {ManObserver tempObserver = list.get(i);if(observer == tempObserver){list.get(i).update(this);}}}}@Overridepublic void removeAllManObserver() {list.clear();list = new ArrayList<ManObserver>();}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Boolean getIsGood() {return isGood;}public void setIsGood(Boolean isGood) {this.isGood = isGood;this.notifiAllManObserver();//这里是关键通知关心自己的所有男孩观察者}public void setIsGood(Boolean isGood,ManObserver observer){this.isGood = isGood;this.notifiAllManObserver(observer);//这里是关键通知关心自己的特定男孩观察者}}
</pre><pre name="code" class="java">观察者男孩们统一方法接口代码:
<pre name="code" class="java">package com.lgy.observer;/** * 男孩观察者接口类,女孩心情好坏通知男孩行为方法类 */public interface ManObserver {void update(GirlObserved observer);}
观察者男孩们对象具体实现:
<pre name="code" class="java">package com.lgy.observer;/** * 男观察者得知女孩心情后,做出反应 */public class ManPerson implements ManObserver {private String name;// 男孩名字@Overridepublic void update(GirlObserved observer) {GirlPerson girl = (GirlPerson) observer;if (girl.getIsGood()) {System.out.println("女孩心情不错,男孩" + this.name + "得到通知在打女孩"+ girl.getName() + "电话:" + girl.getPhone());} else {System.out.println("女孩心情很糟糕,男孩" + this.name + "得到通知后在考虑是否给女孩"+ girl.getName() + "打电话");}}public ManPerson(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
以上代码观察者模式就已经写好了。下面我们开始测试:
<pre name="code" class="java">import com.lgy.observer.GirlPerson;import com.lgy.observer.ManPerson;public class MainCls {public static void main(String[] args) {GirlPerson girlPerson = new GirlPerson("貂蝉", "1341548254", false);ManPerson zfPerson = new ManPerson("张飞");//观察者一ManPerson gyPerson = new ManPerson("关羽");//观察者二ManPerson lbPerson = new ManPerson("刘备");//观察者三girlPerson.addManObserver(zfPerson);girlPerson.addManObserver(gyPerson);girlPerson.addManObserver(lbPerson);//girlPerson.removeAllManObserver();//girlPerson.removeManObserver(zfPerson);girlPerson.setIsGood(true, lbPerson);//girlPerson.setIsGood(true);//girlPerson.setIsGood(false);}}

从上面的代码中我们可以看到:所谓的观察者模式其实就是在被观察者对象中存放一个集合容器,容器中存放着所有的观察者对象,当被观察者的状态发生改变的时候,“通知”就是从集合容器中取出所有的观察者对象调用它们的统一方法做出对策而已。



</pre><br /><br /><pre>

0 0
原创粉丝点击