//Subject java
目前累計(jì)服務(wù)客戶上千余家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。創(chuàng)新互聯(lián)建站始終以務(wù)實(shí)、誠信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對領(lǐng)先技術(shù)的掌握、對創(chuàng)意設(shè)計(jì)的研究、對客戶形象的視覺傳遞、對應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
package youngmaster model Observer;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
* 察者模式屬于行為型模式 其意圖是定義對象間的一種一對多的依賴關(guān)系
* 當(dāng)一個對象的狀態(tài)發(fā)生改變時 所有依賴于它的對象都得到通知并被自動更新
* 在制作系統(tǒng)的過程中 將一個系統(tǒng)分割成一系列相互協(xié)作的類有一個常見的副作用
* 需要維護(hù)相關(guān)對象間的一致性 我們不希望為了維持一致性而使各類緊密耦合
* 因?yàn)檫@樣降低了他們的可充用性 這一個模式的關(guān)鍵對象是目標(biāo)(Subject)和觀察者(Observer)
* 一個目標(biāo)可以有任意數(shù)目的依賴它的觀察者 一旦目標(biāo)的狀態(tài)發(fā)生改變 所有的觀察者都得到通知
* 作為對這個通知的響應(yīng) 每個觀察者都將查詢目標(biāo)以使其狀態(tài)與目標(biāo)的狀態(tài)同步 這種交互也稱為發(fā)布 訂閱模式
* 目標(biāo)是通知的發(fā)布者 他發(fā)出通知時并不需要知道誰是他的觀察者 可以有任意數(shù)據(jù)的觀察者訂閱并接收通知
*/
/**
* subject
*目標(biāo)接口
*/
public interface Subject {
public void addObserver(Observer o);
public void deletObserver(Observer o);
public void notice();
}
//Observer java
package youngmaster model Observer;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*觀察者接口
*/
public interface Observer {
public void update();
}
//Teacher java
package youngmaster model Observer;
import java util Vector;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*目標(biāo)接口實(shí)現(xiàn)
*/
public class Teacher implements Subject {
private String phone;
@SuppressWarnings( unchecked )
private Vector students;
@SuppressWarnings( unchecked )
public Teacher() {
phone = ;
students = new Vector();
}
@SuppressWarnings( unchecked )
@Override
public void addObserver(Observer o) {
students add(o);
}
@Override
public void deletObserver(Observer o) {
students remove(o);
}
@Override
public void notice() {
for (int i = ; i students size(); i++) { ((Observer) students get(i)) update();
}
}
public void setPhone(String phone) {
this phone = phone;
notice();
}
public String getPhone() {
return phone;
}
}
//Student java
package youngmaster model Observer;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*觀察者接口實(shí)現(xiàn)
*/
public class Student implements Observer {
private String name;
private String phone;
private Teacher teacher;
public Student(String name Teacher teacher) { this name = name; this teacher = teacher;
}
public void show() {
System out println( Name: + name + \nTeacher s phone: + phone);
}
@Override
public void update() {
phone = teacher getPhone();
}
}
//Client java
package youngmaster model Observer;
import java util Vector;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*測試類
*/
public class Client {
/**
* @param args
*/
@SuppressWarnings( unchecked )
public static void main(String[] args) {
Vector students = new Vector();
Teacher teacher = new Teacher();
for (int i = ; i ; i++) {
Student student = new Student( student + i teacher); students add(student); teacher addObserver(student);
}
teacher setPhone( );
for (int i = ; i ; i++)
((Student) students get(i)) show();
System out println( \n============================\n );
teacher setPhone( );
for (int i = ; i ; i++)
((Student) students get(i)) show();
}
lishixinzhi/Article/program/Java/gj/201311/27566
StockData( extends Observable)只需要關(guān)注一個事件就好了。把多余的代碼分割出來,封裝到一個event事件類里。只要有新事件就通知? Investor( implements Observer)觀察者有時間了。具體的時間有觀察者調(diào)用時間的方法來觸發(fā)。這樣代碼會整潔不少,邏輯也會很清晰、、
package TestObserver;
import java.util.Iterator;
import java.util.Vector;
/**
*
* @author Seastar
*/
interface Observed {
public void addObserver(Observer o);
public void removeObserver(Observer o);
public void update();
}
interface Observer {
public void takeAction();
}
class Invoker {
private Observer o;
Handler handler;
public Invoker(Observer o) {
new Handler();
this.o = o;
}
private class Handler extends Thread {
public Handler() {
handler = this;
}
@Override
public void run() {
o.takeAction();
}
}
public boolean TestSameObserver(Observer o) {
return o == this.o;
}
public void invoke() {
handler.start();
}
}
class ObservedObject implements Observed {
private VectorInvoker observerList = new VectorInvoker();
public void addObserver(Observer o) {
observerList.add(new Invoker(o));
}
public void removeObserver(Observer o) {
IteratorInvoker it = observerList.iterator();
while (it.hasNext()) {
Invoker i = it.next();
if (i.TestSameObserver(o)) {
observerList.remove(i);
break;
}
}
}
public void update() {
for (Invoker i : observerList) {
i.invoke();
}
}
}
class ObserverA implements Observer {
public void takeAction() {
System.out.println("I am Observer A ,state changed ,so i have to do something");
}
}
class ObserverB implements Observer {
public void takeAction() {
System.out.println("I am Observer B ,i was told to do something");
}
}
class ObserverC implements Observer {
public void takeAction() {
System.out.println("I am Observer C ,I just look ,and do nothing");
}
}
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ObserverA a = new ObserverA();
ObserverB b = new ObserverB();
ObserverC c = new ObserverC();
ObservedObject oo = new ObservedObject();
oo.addObserver(a);
oo.addObserver(b);
oo.addObserver(c);
for (int i = 0; i 5; ++i) {
oo.addObserver(new Observer() {
public void takeAction() {
System.out.println("我是山寨觀察者"+",誰敢攔我");
}
});
}
//sometime oo changed ,so it calls update and informs all observer
oo.update();
}
}
觀察者模式的精髓在于注冊一個觀察者觀測可能隨時變化的對象,對象變化時就會自動通知觀察者,
這樣在被觀測對象影響范圍廣,可能引起多個類的行為改變時很好用,因?yàn)闊o需修改被觀測對象的代碼就可以增加被觀測對象影響的類,這樣的設(shè)計(jì)模式使得代碼易于管理和維護(hù),并且減少了出錯幾率
至于異步機(jī)制實(shí)際是個噱頭,可以有觀測對象來實(shí)現(xiàn)異步,也可以有觀察者自身實(shí)現(xiàn),這個程序?qū)嶋H是觀測對象實(shí)現(xiàn)了異步機(jī)制,方法是在觀察者類外包裝了一層invoker類