学学设计模式【观察者模式】
?观察者模式学习:
比如一个角色发生了变化,或者做了什么操作,要通知其他一系列对象做动作。又叫发布/订阅模式。
写了个例子,下面是个通用类图和一个例子的类图:
下面是例子的部分代码:(例子是中国做了些事情,美国,小日本就急了,跟着做了些事情)
1.首先是一个观察者接口和具体的实现类,
package com.myapp.observer; /** * 观察者接口 * @author seeeyou * */ public interface ForeignObserver { public void doSometing(); } package com.myapp.observer; public class America implements ForeignObserver { public void doSometing() { System.out.println("美国发现中国XXXXXXXXXXX,发表XXXX,中国威胁论..."); } } package com.myapp.observer; public class Jpan implements ForeignObserver { public void doSometing() { System.out.println("日本发现中国XXXXXXXXXXX,也开始自己XXXXXXXXXXX"); } } ?
?
2、然后是被观察者抽象类和实现类,
?
?
package com.myapp.observer; import java.util.ArrayList; import java.util.Iterator; /** * 被观察者,里面包含了两个具体逻辑,可以抽象出一个具体的接口,使被观察接口更单一,这里写在一起 * @author seeeyou * */ public abstract class Subject { ArrayList<ForeignObserver> obseList = new ArrayList<ForeignObserver>(); /** * 增加一个观察者 * @param obj */ public void addObserver(ForeignObserver obj){ obseList.add(obj); } /** * 删除一个观察者,可能根据具体不同,实现也不同 * @param obj */ public void deleteObserver(ForeignObserver obj) { obseList.remove(obj); } /** * 通知所有的观察者 */ public void notifyAllObServer(){ for (ForeignObserver obj : obseList) { obj.doSometing(); } } public abstract void sendWeixing(); public abstract void doYuanZIdan(); } package com.myapp.observer; public class China extends Subject{ /** * 一个具体操作 */ public void sendWeixing(){ System.out.println("中国发射卫星。。。。。。。"); notifyAllObServer(); } /** * 一个具体操作 */ public void doYuanZIdan() { System.out.println("中国做了个原子弹。"); notifyAllObServer(); } } ?
?
?
3.客户端来调:
?
?
package com.myapp.observer; public class Client { public static void main(String[] args) { America america = new America(); Jpan jpan = new Jpan(); Subject subject = new China(); subject.addObserver(america); subject.addObserver(jpan); //发射卫星 subject.sendWeixing(); System.out.println("--------------------"); //造原子弹 subject.doYuanZIdan(); } } 运行结果是: 中国发射卫星。。。。。。。 美国发现中国XXXXXXXXXXX,发表XXXX,中国威胁论... 日本发现中国XXXXXXXXXXX,也开始自己XXXXXXXXXXX -------------------- 中国做了个原子弹。 美国发现中国XXXXXXXXXXX,发表XXXX,中国威胁论... 日本发现中国XXXXXXXXXXX,也开始自己XXXXXXXXXXX
?
结束了
4、目前java中已经有了Observable这个被观察者接口了,只需要实现即可,也已经有了observer观察者接口了,实现也可以。所以这个模式现在应该比较简单了。