




已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
24.Observer樣式應(yīng)用于Android框架設(shè)計(jì)1.Framework的反向控制反向控制(InversionofControl)是應(yīng)用框架(ApplicationFramework,簡(jiǎn)稱(chēng)AF)魅力的泉源。其常見(jiàn)的實(shí)現(xiàn)機(jī)制有二:1)繼承(Inheritance)-這與TemplateMethod樣式密切相關(guān)。2)委托(Delegation)-這與Observer樣式密切相關(guān)。Android是個(gè)完全的AF,處處可見(jiàn)到反向控制的機(jī)制。當(dāng)你熟悉上述的兩種實(shí)現(xiàn)機(jī)制后,就會(huì)將之對(duì)應(yīng)到TemplateMethod和Observer樣式。然后藉由樣式來(lái)更深刻體會(huì)這些機(jī)制的設(shè)計(jì)意涵。如此,除了更能活用Android之外,也能逐漸提升你自己設(shè)計(jì)新AF的興趣、能力和信心。2.復(fù)習(xí):使用繼承(即TemplateMethod樣式)茲復(fù)習(xí)你已經(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樣式來(lái)實(shí)踐反向控制。3.使用委托(即Observer樣式)在TemplateMethod樣式里,hookmethod的具體實(shí)現(xiàn)是撰寫(xiě)在子類(lèi)別里。使用委托時(shí),則將hookmethod定義于獨(dú)立的類(lèi)別里,如下述的HookClass:把hookmethod定義于另外的類(lèi)別:/HookClass.javapublicclassHookClassprotectedfloatgetValue(intcredit)return(credit-1)*500;templatemethod委托HookClass類(lèi)別之對(duì)象去處理客制化的部份:/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的子類(lèi)別:GraduateHook,并且讓Student的對(duì)象委托給GraduateHook子類(lèi)別之對(duì)象:/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類(lèi)別的templatemethod呼叫了HookClass抽象類(lèi)別的getValue()函數(shù),進(jìn)而反向呼叫到GraduateHook子類(lèi)別的getValue()函數(shù)。4.GoF的Observer樣式在GoF的一書(shū)里,其Observer樣式的架構(gòu)圖為:圖1Observer樣式GoF這里的Subject類(lèi)別就對(duì)應(yīng)到上述程序代碼的Student類(lèi)別。ConcreteSubject就對(duì)應(yīng)到Graduate_Student類(lèi)別。Observer類(lèi)別對(duì)應(yīng)到HookClass。ConcreteObserver對(duì)應(yīng)到GraduateHook類(lèi)別。5.Observer樣式又稱(chēng)為L(zhǎng)istener樣式上述的范例可改寫(xiě)為:/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畫(huà)面情境撰寫(xiě)程序建立Android程序項(xiàng)目:/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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)分包班組管理制度
- 宿舍電表安裝方案(3篇)
- 農(nóng)業(yè)園區(qū)財(cái)物管理制度
- 超市到期退場(chǎng)方案(3篇)
- 醫(yī)院安保規(guī)章管理制度
- 商砼公司人事管理制度
- 品牌創(chuàng)建培育方案(3篇)
- 衛(wèi)生應(yīng)急工作管理制度
- 裝修工程賠補(bǔ)方案(3篇)
- 廚房蔬菜進(jìn)貨管理制度
- 沖壓機(jī)床安全操作規(guī)程(3篇)
- 治療性血小板去除術(shù)
- 雇人干活免責(zé)協(xié)議書(shū)(2篇)
- 2024版《糖尿病健康宣教》課件
- 膿毒癥性凝血病診療中國(guó)專(zhuān)家共識(shí)解讀
- 《形勢(shì)與政策》2022-2023學(xué)年 第二學(xué)期學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 云南省昆明市2025屆高三文綜下學(xué)期5月“三診一?!蹦M考試三模試題
- 二年級(jí)《道德與法治》下冊(cè)知識(shí)點(diǎn)
- Unit5Seasons(單元測(cè)試)譯林版英語(yǔ)四年級(jí)下冊(cè)
- 2024全行業(yè)薪酬白皮-薪智x銳仕方達(dá)-202407
- 教師專(zhuān)業(yè)化視角下高職教師能力結(jié)構(gòu)研究
評(píng)論
0/150
提交評(píng)論