Observer样式应用于Android框架设计.doc_第1页
Observer样式应用于Android框架设计.doc_第2页
Observer样式应用于Android框架设计.doc_第3页
Observer样式应用于Android框架设计.doc_第4页
Observer样式应用于Android框架设计.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Observer样式应用于Android框架设计1. Framework的反向控制反向控制(Inversion of Control)是应用框架(Application Framework,简称AF)魅力的泉源。其常见的实现机制有二:1) 继承(Inheritance)- 这与Template Method样式密切相关。2) 委托(Delegation)- 这与Observer样式密切相关。 Android是个完全的AF,处处可见到反向控制的机制。当你熟悉上述的两种实现机制后,就会将之对应到Template Method和Observer样式。然后藉由样式来更深刻体会这些机制的设计意涵。如此,除了更能活用Android之外,也能逐渐提升你自己设计新AF的兴趣、能力和信心。2. 复习:使用继承(即Template Method样式)兹复习你已经熟悉的Template Method样式,如下述之范例: / Student.javapublic class Student private String m_name;private int m_credit;Student(String na, int cr )m_name = na;m_credit = cr;public void print()System.out.println(m_name + , +String.valueOf(template_computeTuition(); public float template_computeTuition() if (m_credit 6) m_credit = 6; return hook_getValue(m_credit) + 5000; protected float hook_getValue(int credit) return (credit -1) * 500; / Graduate_Student.javapublic class Graduate_Student extends StudentGraduate_Student(String na, int cr )super(na, cr);protected float hook_getValue(int credit) return credit * 700;/ Undergraduate_Student.javapublic class Undergraduate_Student extends Student Undergraduate_Student(String na, int cr )super(na, cr);/ JMain.javapublic class JMain public static void main(String args) int credit = 5;Graduate_Student mike = new Graduate_Student(Mike, 5);mike.print();Undergraduate_Student linda = new Undergraduate_Student(Linda, 7);linda.print();这是以Template Method样式来实践反向控制。3. 使用委托(即Observer样式)在Template Method样式里,hook method的具体实现是撰写在子类别里。使用委托时,则将hook method定义于独立的类别里,如下述的HookClass:把hook method定义于另外的类别:/ HookClass.javapublic class HookClass protected float getValue(int credit) return (credit -1) * 500; template method委托HookClass类别之对象去处理客制化的部份:/ Student.javapublic class Student private String m_name;private int m_credit;private HookClass hookObject = null;Student(String na, int cr )m_name = na;m_credit = cr;public void setHook(HookClass hk)hookObject = hk;public void print()System.out.println(m_name + , +String.valueOf(template_computeTuition(); public float template_computeTuition() if (m_credit 6) m_credit = 6; return hookObject.getValue(m_credit) + 5000; 定义HookClass的子类别:GraduateHook,并且让Student的对象委托给GraduateHook子类别之对象:/ Graduate_Student.javapublic class Graduate_Student extends StudentGraduate_Student(String na, int cr )super(na, cr);setHook(new GraduateHook();private static class GraduateHook extends HookClassOverrideprotected float getValue(int credit) return credit * 700;/ JMain.javapublic class JMain public static void main(String args) int credit = 5; Student mike = new Graduate_Student(Mike, credit);mike.print(); 于是,Student类别的template method 呼叫了HookClass抽象类别的getValue()函数,进而反向呼叫到GraduateHook子类别的getValue()函数。4. GoF的Observer样式在GoF的一书里,其Observer样式的架构图为:图1 Observer样式GoF这里的Subject类别就对应到上述程序代码的Student类别。ConcreteSubject就对应到Graduate_Student类别。Observer类别对应到HookClass。ConcreteObserver对应到GraduateHook类别。5. Observer样式又称为Listener样式 上述的范例可改写为:/ IListener.javapublic interface IListener float getValue(int credit);/ Student.javapublic class Student private String m_name;private int m_credit;private IListener plis = null;Student(String na, int cr )m_name = na;m_credit = cr;public void setListener(IListener lis)plis = lis;public void print()System.out.println(m_name + , +String.valueOf(template_computeTuition(); public float template_computeTuition() if (m_credit 6) m_credit = 6; return plis.getValue(m_credit) + 5000; / Graduate_Student.javapublic class Graduate_Student extends StudentGraduate_Student(String na, int cr )super(na, cr);setListener(new GraduateListener();private static class GraduateListener implements IListenerpublic float getValue(int credit) return credit * 700;/ JMain.javapublic class JMain public static void main(String args) int credit = 5; Student mike = new Graduate_Student(Mike, credit);mike.print(); 6. 欣赏Android里的Observer样式(即Listener样式)- 欣赏Android程序范例6.1 画面情境 撰写程序 建立Android程序项目:/ ac01.javapackage com.misoo.pkzz;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class ac01 extends Activity Override public void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.main); Button btn = (Button)findViewById(R.id.button); Button btn2 = (Button)findViewById(R.id.button2); btn.setBackgroundResource(R.drawable.gray); btn.setOnClickListener(clickListener); btn2.setBackgroundResource(R.drawable.byw); btn2.setOnClickListener(clickListener_2); OnClickListener clickListener = new OnClickListener() public void onClick(View v) String name = (Button)v).getText().toString(); setTitle( name + button cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论