亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

觀察者(Observer)模式

系統 1822 0

觀察者模式又叫做發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。

?

觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

?

一個軟件系統常常要求在某一個對象的狀態發生變化的時候,某些其它的對象做出相應的改變。做到這一點的設計方案有很多,但是為了使系統能夠易于復用,應該選擇低耦合度的設計方案。減少對象之間的耦合有利于系統的復用,但是同時設計師需要使這些低耦合度的對象之間能夠維持行動的協調一致,保證高度的協作(Collaboration)。觀察者模式是滿足這一要求的各種設計方案中最重要的一種。

二,結構

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

抽象主題(Subject)角色 :主題角色把所有對觀察考對象的引用保存在一個聚集里,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,主題角色又叫做抽象被觀察者(Observable)角色,一般用一個抽象類或者一個接口實現。

抽象觀察者(Observer)角色 :為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己。這個接口叫做更新接口。抽象觀察者角色一般用一個抽象類或者一個接口實現。在這個示意性的實現中,更新接口只包含一個方法(即Update()方法),這個方法叫做更新方法。

具體主題(ConcreteSubject)角色 :將有關狀態存入具體現察者對象;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者角色(Concrete Observable)。具體主題角色通常用一個具體子類實現。

具體觀察者(ConcreteObserver)角色 :存儲與主題的狀態自恰的狀態。具體現察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。如果需要,具體現察者角色可以保存一個指向具體主題對象的引用。具體觀察者角色通常用一個具體子類實現。

三,示例代碼

?

    import java.util.ArrayList;

/**
 * 抽象主題
 * @author Salmon
 *
 */
public abstract class Subject {
	private ArrayList<Observer> observers = new ArrayList<Observer>();

	public void attach(Observer observer) {
		observers.add(observer);
	}

	public void detach(Observer observer) {
		observers.remove(observer);
	}

	public void _notify() {
		for (Observer o : observers)
			o.update();
	}
}

/**
 * 具體主題
 * @author Salmon
 *
 */
public class ConcreteSubject extends Subject {
	private String subjectState;

	public String getSubjectState() {
		return subjectState;
	}

	public void setSubjectState(String subjectState) {
		this.subjectState = subjectState;
	}
}

/**
 * 抽象觀察者
 * @author Salmon
 *
 */
public interface Observer {
	public void update();
}

/**
 * 具體觀察者
 * @author Salmon
 *
 */
public class ConcreteObserver implements Observer {
	private String name;
	private String observerState;
	private ConcreteSubject subject;

	public ConcreteSubject getSubject() {
		return subject;
	}

	public void setSubject(ConcreteSubject subject) {
		this.subject = subject;
	}

	// Constructors
	public ConcreteObserver(ConcreteSubject subject, String name) {
		this.subject = subject;
		this.name = name;
	}

	// Methods
	public void update() {
		observerState = subject.getSubjectState();
		// Console.WriteLine( "Observer {0}'s new state is {1}",
		// name, observerState );
	}
}

/**
 * 客戶代碼
 * @author Salmon
 * 
 */
public class Client {
	public static void Main(String[] args) {
		// Configure Observer structure
		ConcreteSubject s = new ConcreteSubject();
		s.attach(new ConcreteObserver(s, "1"));
		s.attach(new ConcreteObserver(s, "2"));
		s.attach(new ConcreteObserver(s, "3"));

		// Change subject and notify observers
		s.setSubjectState("ABC");
		s._notify();
	}
}
  

?

觀察者(Observer)模式


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 永久黄网站色视频免费 | 免费人成激情视频在线看 | 日日摸夜夜添夜夜添一区二区 | 精品亚洲视频在线观看 | 不卡国产| 久久免费大片 | 亚洲伦理中文字幕 | 久久久网站 | 亚洲国产一区二区三区a毛片 | 国产a一级毛片午夜剧场14 | 日韩高清一区二区 | 色综合亚洲七七久久桃花影院 | 亚洲综合首页 | 免费观看成人www精品视频在线 | 成人人观看的免费毛片 | 久久噜噜久久久精品66 | 色综合久久88色综合天天小说 | 欧美日韩高清观看一区二区 | 精品视频免费在线 | 久久久这里有精品 | 日本伊人精品一区二区三区 | 奇米影视久久 | 国产精品日韩欧美久久综合 | 国产成人一区二区在线不卡 | 久久99国产乱子伦精品免费 | 亚洲精品一区二区中文 | 四虎影院永久网站 | 天天干天天色天天射 | 久久se精品一区二区国产 | 欧美日韩亚洲另类 | 日本一区二区三区高清福利视频 | 黄色成人在线网站 | 亚洲精品福利一区二区 | 欧美另类videosbestv | 日日夜夜摸摸 | 亚洲免费视频在线 | 久操视频在线观看 | 国产精品欧美亚洲区 | 精品视频久久 | 亚洲最新在线 | 欧美日本三级 |