java設計模式之觀察者模式 1.觀察者模式 1.1定義
觀察者()模式的定義:指多個對象間存在一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。這種模式有時又稱作發布-訂閱模式、模型-視圖模式,它是對象行為型模式。
觀察者模式是一種對象行為型模式觀察者設計模式uml圖,其主要優點如下:
降低了目標與觀察者之間的耦合關系,兩者之間是抽象耦合關系。
目標與觀察者之間建立了一套觸發機制。
它的主要缺點如下:
目標與觀察者之間的依賴關系并沒有完全解除,而且有可能出現循環引用。
當觀察者對象很多時,通知的發布會花費很多時間,影響程序的效率。
1.2模式結構和特定
觀察者模式的主要角色如下:
抽象主題()角色:也叫抽象目標類,它提供了一個用于保存觀察者對象的聚集類和增加、刪除觀察者對象的方法,以及通知所有觀察者的抽象方法。
具體主題( )角色:也叫具體目標類,它實現抽象目標中的通知方法,當具體主題的內部狀態發生改變時,通知所有注冊過的觀察者對象。
抽象觀察者()角色:它是一個抽象類或接口,它包含了一個更新自己的抽象方法,當接到具體主題的更改通知時被調用。
具體觀察者( )角色:實現抽象觀察者中定義的抽象方法,以便在得到目標的更改通知時更新自身的狀態。
1.3 問題由來
在現實世界中,許多對象并不是獨立存在的,其中一個對象的行為發生改變可能會導致一個或者多個其他對象的行為也發生改變。例如,某種商品的物價上漲時會導致部分商家高興觀察者設計模式uml圖,而消費者傷心;還有,當我們開車到交叉路口時,遇到紅燈會停,遇到綠燈會行。這樣的例子還有很多,例如,股票價格與股民、微信公眾號與微信用戶。
1.4 解決思路
就是要實現當多個對象間存在一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。通過接口可以具體目標對象和具體觀察者對象之間不直接調用,并實現觀察模式
/**
* @author tbb
* 公眾號
*/
public abstract class OfficialAccount
{
protected List<WeixinUser> userList = new ArrayList<WeixinUser>();
public void addUser(WeixinUser weixinUser)
{
userList.add(weixinUser);
}
public abstract void sendMessage(String message);
}
/**
* @author tbb
* 微信公眾號
*/
public class WeixinOfficialAccount extends OfficialAccount
{
@Override
public void sendMessage(String message)
{
for (WeixinUser user : userList)
{
user.receiveMessage(message);
}
}
}
public interface WeixinUser
{
public void receiveMessage(String message);
public void showMessage();
}
public class ZhangSanUser implements WeixinUser{
private String message;
@Override
public void receiveMessage(String message)
{
this.message = message;
}
@Override
public void showMessage()
{
System.out.println(message);
}
}
public class Test
{
public static void main(String[] args)
{
WeixinOfficialAccount wxgzh = new WeixinOfficialAccount();
ZhangSanUser zs = new ZhangSanUser();
wxgzh.addUser(zs);
wxgzh.sendMessage("111");
zs.showMessage();
}
}