金強山 馮光 孫傳國
摘? 要: 針對“軟件設計與體系結構”課程中設計模式的抽象性與復雜性,為了使學生能夠更好的理解“觀察者模式”的設計思路,設計了該綜合性實驗案例。該實驗以溫室蔬菜大棚中溫度、濕度、CO2、光照的數據采集處理問題為實例,對實驗目的、實驗要求、實驗環(huán)境、實驗步驟做了詳細介紹,目的是使學生掌握“觀察者模式”的結構與原理,能夠分析解決實際的問題。實踐表明:通過綜合性實驗案例,能提升學生學習的主動性和對知識的掌握程度,培養(yǎng)學生分析問題、解決問題的能力。
關鍵詞: 觀察者; 設計模式; 綜合性實驗; 案例
中圖分類號:TP311.1? ? ? ? ? 文獻標識碼:A? ? ?文章編號:1006-8228(2022)05-105-04
Comprehensive experimental design for "Observer Pattern" software engineering
Jin Qiangshan, Feng Guang, Sun Chuanguo
Abstract: Aiming at the abstraction and complexity of design patterns in the course of "software design and architecture", in order to enable students to better understand the design idea of "Observer Pattern", this comprehensive experimental case is designed. Taking the data acquisition and processing of temperature, humidity, CO2, and light in a vegetable greenhouse as an example, the purpose of the experiment, experimental requirements, experimental environment, and experimental steps are introduced in detail. It enables students to master the structure and principle of "Observer Pattern" and be able to analyze and solve practical problems. Practice shows that through comprehensive experimental cases, students can not only improve their learning initiative and mastery of knowledge, but also cultivate their ability to analyze and solve problems.
Key words: observers; design mode; comprehensive experiment; case
引言
“軟件設計與體系結構”課程是軟件工程專業(yè)的核心課程之一,主要在于提高設計者的開發(fā)效率與軟件質量,使設計的軟件更加靈活,具有可拓展性和可復用性。“設計模式”是“軟件設計與體系結構”課程的重要內容,它主要解決面向對象系統中的類似的問題,建立整個設計方案,給出系統的名稱和解釋[1]。學生需要理解軟件工程領域體系結構設計的基本思想,掌握面向對象設計的原則,靈活選擇與應用軟件設計模式,解決實際工程項目中存在的問題。
1 設計模式
設計模式[2]具有一定的抽象性和具體性,在軟件開發(fā)的過程中,它聯系著需求分析和系統實現,是溝通抽象設計和具體實現的橋梁。同時設計模式提高了軟件的封裝性和模塊化,降低了對象之間的耦合性,改善了軟件的可維護性和可拓展性。設計模式主要分為行為型、設計型、結構型三大類[3],其中觀察者模式作為一種常用的、使用頻率高的設計模式,它主要解決對象之間存在“一對多”的依賴關系,“一”發(fā)生變化時,“多”也能夠自動發(fā)生變化的問題。
2 觀察者模式
2.1 模式定義
觀察者模式[4](Observer Pattern)意味著對象之間存在相互的依賴關系,當對象的狀態(tài)發(fā)生變化時,可以自動通知和更新其依賴關系。即一個主題[5-6](Subject)同時被多個觀察者[5-6](Observer)監(jiān)聽,當主題更改時,會通知多個觀察者自動更新。觀察者模式也稱為訂閱模式、模型視圖模式和源偵聽器模式[7]。
2.2 模式動機
觀察者模式可以減弱對象之間的依賴關系,降低耦合度,而且這些低耦合的對象之間在行動上能夠保持高度一致,彼此依賴減弱但能夠相互提供服務。觀察模式的對象之間彼此存在“1:n”的依賴關系,“1”發(fā)生變化,“n”收到通知自動更新;其中“1”(發(fā)生變化的對象)稱為主題,“n”(被通知的對象)稱為觀察者[8]。主題和觀察者之間存在“1:n”的依賴關系,但是觀察者與觀察者之間不存在彼此的聯系,在具體的實際情況中,可根據需求增加和刪除對象,極大的提升系統開發(fā)的拓展性。
2.3 模式結構
“觀察者模式”的結構圖[9-11]如圖1所示,主要包括四種角色。
⑴ 抽象主題(Subject)
抽象主題指被觀察者檢測的對象。抽象主題一般定義為接口,也可以是抽象類。抽象主題中能夠存儲任意多個觀察者,通過attach()和detach()方法可以增加和刪除觀察者;定義notify()方法通知觀察者主題已發(fā)生變化,自動進行更新。
⑵ 具體主題(ConcreteSubject)
具體主題是抽象主題的實現類或子類,它實現了抽象主題中的抽象方法。通常它的狀態(tài)信息發(fā)生變化時,向依賴于它的多個觀察者會自動發(fā)送通知。
⑶ 抽象觀察者(Observer)
抽象觀察者也稱為觀察者,是指依賴于主題的對象。抽象主題通常被定義為一個接口,它定義了抽象update()方法,允許特定的觀察者在發(fā)布主題時自動更新自己。
⑷ 具體觀察者(ConcreteObserver)
具體觀察者實現抽象觀察者接口中定義的update()方法,它存儲與主題相一致的狀態(tài),確保與主題保持高度一致與狀態(tài)協調。
2.4 模式分析
觀察者模式時序圖[12,13]所示,在實際的使用過程中,首先創(chuàng)建具體觀察者和具體主題,通過調用具體主題的attach(Observer observer)方法添加觀察者,在同一個主題上可以添加多個觀察者。其次,當使用setState()方法改變具體主題的狀態(tài)后,會調用具體主題的notify()方法,通過notify()方法將會激活注冊在此主題中具體觀察者的update()方法,所有觀察者將收到主題發(fā)送的通知,最后,觀察者調用getState()方法獲取具體主題的最新狀態(tài)。
2.5 適用情景
針對具體的問題,如果存在以下的情況,可以選擇觀察者模式。
⑴ 在實際問題抽象的過程中,存在兩個抽象的對象,一個對象的改變將導致其他一個或多個對象發(fā)生變化,但這個對象具體不知道有多少個對象需要更新數據[14-15],多個對象之間不存在聯系,可以對多個對象進行添加和刪除,降低了多個對象之間的耦合度。
⑵ 當一個對象的數據更新時需要通知其他對象,但這個對象不希望和被通知的那些對象形成緊耦合。
3 綜合設計性實驗案例
實驗在Windows操作系統下,借助Eclipse快速開發(fā)實現溫室蔬菜大棚溫度、濕度、CO2、光照檢測與預報,介紹綜合設計性實驗案例的設計。
3.1 實驗目的
①理解和掌握觀察者模式的運行原理;②能夠利用觀察者模式分析實際問題;③能夠繪制觀察者模式實例類圖;④熟練掌握觀察者模式的代碼編寫。
3.2 實驗要求
利用觀察者模式編寫程序,實現對溫室蔬菜大棚溫度和濕度的檢測與預報,CO2的檢測與預報,光照的檢測與預報,分別顯示在3個微型顯示屏上,實驗數據模擬溫室蔬菜大棚傳感器的輸入。
3.3 實驗環(huán)境
實驗所使用的計算機為Inter(R)Core(TM)i5-4590、3.3GHz、4GB內存、Win7操作系統,使用JDK1.8、Eclipse4.7.2、StarUML3.2.2開發(fā)環(huán)境。
3.4 實驗步驟
⑴ 分析問題,繪制類圖。對現實問題進行抽象,明確各對象之間的關系,利用StarUML繪制類圖,溫室蔬菜大棚實例類圖分析如圖2所示。
⑵ 分析對象之間的動態(tài)交互過程,繪制時序圖。對抽象的所有對象進行動態(tài)分析,利用StarUML繪制時序圖,如圖3所示。
⑶ 在Eclipse中新建項目Greenhouse,編寫Subject接口和Observer接口。
⑷ 編寫具體主題類GreenhouseData,實現Subject接口。
⑸ 編寫三個具體觀察者類TemHumObserver、CO2Observer、LightObserver,實現Observer接口和Screen接口。
⑹ 新建測試類Client,對程序進行測試。
3.5 實驗結果
當溫室蔬菜大棚中模擬傳感器將數據獲取到之后,三個顯示屏會自動更新數據信息,以保證數據的時效性與及時預報,運行結果如圖4所示。
4 結束語
通過“觀察者模式”綜合性設計實驗案例,學生能夠熟練掌握觀察者模式的設計原理;在面對現實中的具體問題,能夠利用觀察者模式解決特定的問題,提升代碼的復用性,降低對象之間的耦合性。在綜合性設計實驗案例的實施過程中,不僅考查了學生的編程能力,而且考查了學生對觀察者模式的理解,提升了學生面向對象程序設計的能力,激發(fā)了學生學習程序設計的興趣,夯實學生的專業(yè)基礎。
參考文獻(References):
[1] 李慧貞,鄭恩讓,張會生.電信管理網絡中觀察者模式的應用
研究[J].微電子學與計算機,2005(9):89-92
[2] 周宇,趙洪達,張倩雯.軟件設計模式課程實驗教學系統探索[J].
計算機系統應用,2017,26(5):86-90
[3] Freeman E, Robson E, Bates B, Sierra K. Head First
Design Patterns. US: O’Reilly Media,2004
[4] 陳萍萍,于衛(wèi)紅,陳燕.觀察者模式中的“拉”模型在電子商務
系統中的應用[J].計算機時代,2014(9):49-51
[5] 李英軍,馬曉星,蔡敏等,譯.設計模式:可復用面向對象軟件
的基礎[M].北京:機械工業(yè)出版社,2005:89
[6] 李亞崗,王啟明.設計模式及其應用研究[J].伊犁師范學院
學報(自然科學版),2007(2):39-42
[7] 王海賓,白尚旺,黨偉超,等.基于Observer模式的AS/RS調
度系統設計與實現[J].計算機技術與發(fā)展,2009,19(3):110-113,122
[8] 劉小凡.監(jiān)測類軟件設計中觀察者模式淺析[J].儀器儀表與
分析監(jiān)測,2016(4):5-8
[9] [美]ErichGamma等著.設計模式[M].機械工業(yè)出版社,2000
[10] 耿祥義.Java設計模式[M].清華大學出版社,2009
[11] 劉偉.設計模式(第2版)[M].清華大學出版社,2019
[12] ErichGamma,加馬,李英軍.設計模式:可復用面向對象
軟件的基礎[J].機械工業(yè)出版社,2000
[13] 狄斌.設計模式的研究及在圖表類庫中的應用[D].北京工
業(yè)大學,2009
[14] 劉凌云.觀察者模式在面向抽象編程中的應用[J].計算機
與數字工程,2016,44(8):1474-1477,1522
[15] 歐陽宏基,楊衛(wèi)忠,趙薔.觀察者模式在Java事件處理中的
應用研究[J].微處理機,2013,34(4):77-79
收稿日期:2021-10-11
*基金項目:教育部產學合作協同育人項目(202002254013); 新疆自治區(qū)高校本科教育教學研究和改革項目
作者簡介:金強山(1990-),男,甘肅永昌人,碩士,新疆理工學院信息工程學院教學辦主任,主要研究方向:軟件工程、數據挖掘。