一. Observer樣式應用於Android框架設計
来自: android.tgbus/Android/androidnews/200902/176475.shtml
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.java
public 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.java
public class Graduate_Student extends Student{
Graduate_Student(String na, int cr ){
super(na, cr);
}
protected float hook_getValue(int credit){
return credit * 700;
}
}
// Undergraduate_Student.java
public class Undergraduate_Student extends Student {
Undergraduate_Student(String na, int cr ){
super(na, cr);
}
}
// JMain.java
public 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.java
public class HookClass {
protected float getValue(int credit){
return (credit -1) * 500;
}
}
template method委託HookClass類別之物件去處理客製化的部份:
// Student.java
public 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.java
public class Graduate_Student extends Student{
Graduate_Student(String na, int cr ){
super(na, cr);
setHook(new GraduateHook());
}
private static class GraduateHook extends HookClass{
@Override
protected float getValue(int credit){
return credit * 700;
}
}
}
// JMain.java
public class JMain {
public static void main(String[] args) {
int credit = 5;
Student mike = new Graduate_Student("Mike", credit);
mike.print();
}
}
於是,Student類別的template method 呼叫了
上一篇:
CQUT_android平台_智能车库_毕业设计论文(word文档)
下一篇:
猪疥癣病的防治