已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
24.Observer樣式應用于Android框架設計1.Framework的反向控制反向控制(InversionofControl)是應用框架(ApplicationFramework,簡稱AF)魅力的泉源。其常見的實現(xiàn)機制有二:1)繼承(Inheritance)-這與TemplateMethod樣式密切相關。2)委托(Delegation)-這與Observer樣式密切相關。Android是個完全的AF,處處可見到反向控制的機制。當你熟悉上述的兩種實現(xiàn)機制后,就會將之對應到TemplateMethod和Observer樣式。然后藉由樣式來更深刻體會這些機制的設計意涵。如此,除了更能活用Android之外,也能逐漸提升你自己設計新AF的興趣、能力和信心。2.復習:使用繼承(即TemplateMethod樣式)茲復習你已經(jīng)熟悉的TemplateMethod樣式,如下述之范例:/Student.javapublicclassStudentprivateStringm_name;privateintm_credit;Student(Stringna,intcr)m_name=na;m_credit=cr;publicvoidprint()System.out.println(m_name+,+String.valueOf(template_computeTuition();publicfloattemplate_computeTuition()if(m_credit6)m_credit=6;returnhook_getValue(m_credit)+5000;protectedfloathook_getValue(intcredit)return(credit-1)*500;/Graduate_Student.javapublicclassGraduate_StudentextendsStudentGraduate_Student(Stringna,intcr)super(na,cr);protectedfloathook_getValue(intcredit)returncredit*700;/Undergraduate_Student.javapublicclassUndergraduate_StudentextendsStudentUndergraduate_Student(Stringna,intcr)super(na,cr);/JMain.javapublicclassJMainpublicstaticvoidmain(Stringargs)intcredit=5;Graduate_Studentmike=newGraduate_Student(Mike,5);mike.print();Undergraduate_Studentlinda=newUndergraduate_Student(Linda,7);linda.print();這是以TemplateMethod樣式來實踐反向控制。3.使用委托(即Observer樣式)在TemplateMethod樣式里,hookmethod的具體實現(xiàn)是撰寫在子類別里。使用委托時,則將hookmethod定義于獨立的類別里,如下述的HookClass:把hookmethod定義于另外的類別:/HookClass.javapublicclassHookClassprotectedfloatgetValue(intcredit)return(credit-1)*500;templatemethod委托HookClass類別之對象去處理客制化的部份:/Student.javapublicclassStudentprivateStringm_name;privateintm_credit;privateHookClasshookObject=null;Student(Stringna,intcr)m_name=na;m_credit=cr;publicvoidsetHook(HookClasshk)hookObject=hk;publicvoidprint()System.out.println(m_name+,+String.valueOf(template_computeTuition();publicfloattemplate_computeTuition()if(m_credit6)m_credit=6;returnhookObject.getValue(m_credit)+5000;定義HookClass的子類別:GraduateHook,并且讓Student的對象委托給GraduateHook子類別之對象:/Graduate_Student.javapublicclassGraduate_StudentextendsStudentGraduate_Student(Stringna,intcr)super(na,cr);setHook(newGraduateHook();privatestaticclassGraduateHookextendsHookClassOverrideprotectedfloatgetValue(intcredit)returncredit*700;/JMain.javapublicclassJMainpublicstaticvoidmain(Stringargs)intcredit=5;Studentmike=newGraduate_Student(Mike,credit);mike.print();于是,Student類別的templatemethod呼叫了HookClass抽象類別的getValue()函數(shù),進而反向呼叫到GraduateHook子類別的getValue()函數(shù)。4.GoF的Observer樣式在GoF的一書里,其Observer樣式的架構圖為:圖1Observer樣式GoF這里的Subject類別就對應到上述程序代碼的Student類別。ConcreteSubject就對應到Graduate_Student類別。Observer類別對應到HookClass。ConcreteObserver對應到GraduateHook類別。5.Observer樣式又稱為Listener樣式上述的范例可改寫為:/IListener.javapublicinterfaceIListenerfloatgetValue(intcredit);/Student.javapublicclassStudentprivateStringm_name;privateintm_credit;privateIListenerplis=null;Student(Stringna,intcr)m_name=na;m_credit=cr;publicvoidsetListener(IListenerlis)plis=lis;publicvoidprint()System.out.println(m_name+,+String.valueOf(template_computeTuition();publicfloattemplate_computeTuition()if(m_credit6)m_credit=6;returnplis.getValue(m_credit)+5000;/Graduate_Student.javapublicclassGraduate_StudentextendsStudentGraduate_Student(Stringna,intcr)super(na,cr);setListener(newGraduateListener();privatestaticclassGraduateListenerimplementsIListenerpublicfloatgetValue(intcredit)returncredit*700;/JMain.javapublicclassJMainpublicstaticvoidmain(Stringargs)intcredit=5;Studentmike=newGraduate_Student(Mike,credit);mike.print();6.欣賞Android里的Observer樣式(即Listener樣式)-欣賞Android程序范例6.1畫面情境撰寫程序建立Android程序項目:/ac01.javapackagecom.misoo.pkzz;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;publicclassac01extendsActivityOverridepublicvoidonCreate(Bundleicicle)super.onCreate(icicle);setContentView(R.layout.main);Buttonbtn=(Button)findViewById(R.id.button);Buttonbtn2=(Button)findViewById(R.id.button2);btn.setBackgroundResource(R.drawable.gray);btn.setOnClickListener(clickListener);btn2.setBackgroundResource(R.drawable.byw);btn2.setOnClickListener(clickListener_2);OnClickListenerclickListener=newOnClickListener()publicvoidonClick(Viewv)Stringname=(Button)v).getText().toString();setTitle(name+buttonc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 對待學習的正確態(tài)度議論文5篇
- 趣味小知識教學課件
- 老師眼中的我寫人記敘文8篇
- 趣味化學知識講座
- 物料供應按時保障保證承諾書5篇范文
- 辦公室環(huán)境安全評估預案
- 家庭裝修裝飾技巧手冊
- 2026年律師事務所以身代位合同協(xié)議
- 電動車配件銷售合同協(xié)議2026年稅務處理
- 2025年保管員專業(yè)知識面試題庫及答案
- 2025全國注冊監(jiān)理工程師繼續(xù)教育考試題庫及參考答案
- “無廢醫(yī)院”建設指引
- 籃球比賽應急預案及措施
- 2025-2030衛(wèi)星互聯(lián)網(wǎng)星座組網(wǎng)進度與地面終端兼容性報告
- 醫(yī)院功能科年終總結
- 醫(yī)院科室整改前后對比
- 2024年QC課題(提升辦案現(xiàn)場執(zhí)法效率)專賣監(jiān)督管理科
- 青光眼病人的健康宣教
- 海外機械設備管理制度
- 弘揚教育家精神:新時代教師的使命與擔當
- 向銀行申請減免利息還本金申請書樣板
評論
0/150
提交評論