24Observer樣式應(yīng)用于Android框架設(shè)計.doc_第1頁
24Observer樣式應(yīng)用于Android框架設(shè)計.doc_第2頁
24Observer樣式應(yīng)用于Android框架設(shè)計.doc_第3頁
24Observer樣式應(yīng)用于Android框架設(shè)計.doc_第4頁
24Observer樣式應(yīng)用于Android框架設(shè)計.doc_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

24.Observer樣式應(yīng)用于Android框架設(shè)計1.Framework的反向控制反向控制(InversionofControl)是應(yīng)用框架(ApplicationFramework,簡稱AF)魅力的泉源。其常見的實現(xiàn)機制有二:1)繼承(Inheritance)-這與TemplateMethod樣式密切相關(guān)。2)委托(Delegation)-這與Observer樣式密切相關(guān)。Android是個完全的AF,處處可見到反向控制的機制。當你熟悉上述的兩種實現(xiàn)機制后,就會將之對應(yīng)到TemplateMethod和Observer樣式。然后藉由樣式來更深刻體會這些機制的設(shè)計意涵。如此,除了更能活用Android之外,也能逐漸提升你自己設(shè)計新AF的興趣、能力和信心。2.復(fù)習:使用繼承(即TemplateMethod樣式)茲復(fù)習你已經(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樣式的架構(gòu)圖為:圖1Observer樣式GoF這里的Subject類別就對應(yīng)到上述程序代碼的Student類別。ConcreteSubject就對應(yīng)到Graduate_Student類別。Observer類別對應(yīng)到HookClass。ConcreteObserver對應(yīng)到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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論