By 高煥堂
好莱坞(Hollywood)原则的演练
1. 前言
在上一篇文章<<框架开发:好莱坞(Hollywood)大明星原则>>里,提到了:由于要等客户出现才能决定轮胎,所以客户到来之前,先不做轮胎。于是,框架设计的时间轴为:
图1 汽车需求知识获得的时间轴
于是,把轮胎部分去掉,先不做轮胎,而得出「汽车轮盘」(或「轮毂」),如下图所示:
图2 挖掉轮胎之后,先做部分就是框架了
2. 演练
<<演练一>>
此例子是一个简单的应用程序,只做1+2+3+ … + N的值而已。依据框架设计时间轴:
图3 框架的知识获得时间表(Ex.1)
从上图可知:
- 先做算法部分,所以强龙可将算法(1+2+3+… +N)撰写于框架的基类里。
- N值部份留给AP开发者决定,所以地头蛇可N值撰写于应用子类里。
于是,此框架的设计图如下:
图4 框架的设计图(Ex.1)
其中,先做部分就是框架部份;而先不做部分则是AP部分。强龙先做框架部份,以Java撰写框架部份的代码(引擎是框架的一部分),如下:
// 引擎部份
public class Calculator {
private Count ref;
public int run() {
int n = getN();
int sum = 0;
for(int i=0; i<=n; i++) sum += i;
return sum;
}
private int getN() { return ref.getCount(); }
public void setRef(Count co){ ref = co; }
}
//框架部份
package Framework;
public abstract class Count {
public int getCount() {
int cc = onCount();
return cc;
}
protected abstract int onCount();
}
[歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]
<<演练二>>
如果时间轴改为:
图5 框架的知识获得时间表(Ex.2)
修改设计图为:
图6 框架的设计图(Ex.2)
实现代码如下:
//框架部份
package Engine;
import Framework.Count;
public class Calculator {
private Count ref;
public int run() {
return ref.calculate();
}
public void setRef(Count co){
ref = co;
}
}
//----------------------------------------------------
package Framework;
public abstract class Count {
public int calculate(){
int N = getCount();
return onCal(N);
}
public int getCount() {
return 10;
}
protected abstract int onCal(int k);
}
//应用部分
import Framework.Count;
public class myCount extends Count{
protected int onCal(int N){
int sum = 0;
for(int i=0; i<=N; i++) {
sum += i;
}
return sum;
}
}
// -------------------------------------------------------------
import Engine.Calculator;
import Framework.Count;
public class JMain {
public static void main(String[] args) {
Calculator cal = new Calculator();
Count co = new myCount();
cal.setRef(co);
System.out.println(cal.run());
}
}
当客户需要计算:
1^1 + 2^2 + … + N^N时候,
可撰写应用子类如下:
import Framework.Count;
public class myCount _2 extends Count{
protected int onCal(int N){
int sum = 0;
for(int i=0; i<=N; i++) { sum += i*i; }
return sum;
}}
<<演练三>>
如果时间轴改为:
图7 框架的知识获得时间表(Ex.3)
修改设计图为:
图8 框架的设计图(Ex.3)
实现代码如下:
// 框架部份
package Framework;
public abstract class Count {
public int calculate(){
int N = getCount();
int sum = 0;
for(int i=0; i<=N; i++) sum += onItem(i);
return sum;
}
public int getCount() { return 10; }
protected abstract int onItem(int k);
}
//应用子类部份
import Framework.Count;
public class myCount extends Count{
protected int onItem(int k){
return k;
}
}
框架提供Default 行为:
// 父类部份
package Framework;
public abstract class Count {
public int calculate(){
int N = getCount();
int sum = 0;
for(int i=0; i<=N; i++) {
sum += onItem(i);
}
return sum;
}
public int getCount() { return 10; }
protected int onItem(int k) { return k; }
}
// 应用子类
import Framework.Count;
public class myCount extends Count {}
<<演练四>>
如果时间轴改为:
图9 框架的知识获得时间表(Ex.4)
设计图更改为:
图10 框架的设计图(Ex.4)
撰写如下的Android代码:
// 框架部份
package Engine;
import Framework.Count;
public class Calculator {
private Count ref;
public int run() {
return ref.calculate();
}
public void setRef(Count co){
ref = co;
}
}
//-----------------------------------------------
package Framework;
public abstract class Count {
public int calculate(){
int N = getCount();
int sum = 0;
for(int i=0; i<=N; i++) {
sum += onItem(i);
}
return sum;
}
public int getCount() {
return onCount();
}
protected abstract int onCount();
protected abstract int onItem(int k);
}
// AP部分
package com.misoo.ppxx;
import Framework.Count;
public class myCount extends Count{
protected int onCount(){
return myActivity.mN;
}
@Override
protected int onItem(int k) {
return k;
}
}
//-----------------------------------------------------------
package com.misoo.ppxx;
import Engine.Calculator;
import Framework.Count;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
public class myActivity extends Activity implements OnClickListener {
private Button btn, btn2;
private EditText et;
public static int mN;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(100, 55);
param.leftMargin = 1; param.topMargin = 3;
et = new EditText(this); et.setId(100);
et.setOnClickListener(this);
layout.addView(et, param);
btn = new Button(this); btn.setId(101);
btn.setText("Run"); btn.setOnClickListener(this);
btn.setBackgroundResource(R.drawable.x_jude);
layout.addView(btn, param);
btn2 = new Button(this); btn2.setId(102);
btn2.setText("Exit"); btn2.setOnClickListener(this);
btn2.setBackgroundResource(R.drawable.x_sky);
layout.addView(btn2, param);
setContentView(layout);
}
public void onClick(View v) {
switch(v.getId()) {
case 100:
String ss = et.getText().toString();
mN = Integer.parseInt(ss);
setTitle(ss);
break;
case 101:
Calculator cal = new Calculator();
Count co = new myCount();
cal.setRef(co);
int result;
result = cal.run();
setTitle(String.valueOf(result));
break;
case 102:
finish(); break;
}
}
}
~ END ~
[Go Back]