




已閱讀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)稱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)是撰寫在子類別里。使用委托時(shí),則將hookmethod定義于獨(dú)立的類別里,如下述的HookClass:把hookmethod定義于另外的類別:/HookClass.javapublicclassHookClassprotectedfloatgetValue(intcredit)return(credit-1)*500;templatemethod委托HookClass類別之對(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的子類別:GraduateHook,并且讓Student的對(duì)象委托給GraduateHook子類別之對(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類別的templatemethod呼叫了HookClass抽象類別的getValue()函數(shù),進(jìn)而反向呼叫到GraduateHook子類別的getValue()函數(shù)。4.GoF的Observer樣式在GoF的一書里,其Observer樣式的架構(gòu)圖為:圖1Observer樣式GoF這里的Subject類別就對(duì)應(yīng)到上述程序代碼的Student類別。ConcreteSubject就對(duì)應(yīng)到Graduate_Student類別。Observer類別對(duì)應(yīng)到HookClass。ConcreteObserver對(duì)應(yīng)到GraduateHook類別。5.Observer樣式又稱為L(zhǎng)istener樣式上述的范例可改寫為:/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程序項(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 積極參與志愿活動(dòng)回饋社會(huì)計(jì)劃
- 制定職業(yè)生涯的長(zhǎng)期規(guī)劃計(jì)劃
- 法學(xué)概論考試的互動(dòng)學(xué)習(xí)模式與試題及答案探討
- 前臺(tái)文員與其他部門的協(xié)調(diào)溝通計(jì)劃
- 信息技術(shù)市場(chǎng)的變化與機(jī)遇測(cè)試試題及答案
- 網(wǎng)絡(luò)管理員考試能力評(píng)估試題及答案
- 品牌預(yù)期與消費(fèi)者行為的關(guān)聯(lián)計(jì)劃
- 提升項(xiàng)目交付能力的策略計(jì)劃
- 2024年吉林省生態(tài)環(huán)境廳下屬事業(yè)單位真題
- 2024年湖北省交通運(yùn)輸廳下屬事業(yè)單位真題
- 2025-2030年中國(guó)聚脲涂料行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025年教育行業(yè)工會(huì)工作計(jì)劃
- 海洋能發(fā)電技術(shù)-中國(guó)海洋能發(fā)電技術(shù)(新能源發(fā)電技術(shù))
- 合規(guī)管理考試試題及答案
- 創(chuàng)業(yè)大賽活動(dòng)策劃方案
- 西部計(jì)劃考試試題及答案
- 【廣安】2025上半年四川廣安理工學(xué)院籌建處第一次招聘非事業(yè)編制專任教師15人筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 2025醫(yī)院護(hù)理面試題庫(kù)及答案
- 餐廳供餐協(xié)議書范本
- 焊工初級(jí)測(cè)試試題及答案
- 供水公司筆試試題及答案
評(píng)論
0/150
提交評(píng)論