前言:

在软件开发上,写代码是<实>,画设计图是<虚>。程序员务实,设计员务虚。由于<干实事>被推崇,所以大多开发者都务实了,不画图做设计了。例如,数十本仿间的中文Android书籍里,除了我的书之外,几乎没有UML图,让年轻一代逐渐失去图形思考习惯,这将损害其创造能力。


高老师陪您成长...


EE EE

相關文章:

1. 如何设计平台框架的<未来性>

2. 平台框架(Framework)开发的雕龙之技6招


如何绘制平台框架的设计图:使用UML工具


1. 复习:开始使用UML建模工具(如JUDE)

开启JUDE建模工具:

点选<File/New>,创建新建模项目:

建立新的类图(Class Diagram):

类图绘图区:

拉出一个类的图像,并取名为 ”汽车”:

2. 开始设计框架

框架设计练习口诀:目前先”不”做轮胎

老子说:”无” 之以为用(有之以为利)

孔子说:知之为知之,”不”知为不知

最伟大的雕刻师罗丹( Musée Rodin)说:把”不”必要的部分去掉。

~~ 先不做轮胎 ~~

相当于:

[歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]

3. 应用框架设计范例

这个Calculator类的范例代码:

// 引擎部份

class Calculator {

public int run() {

int n;

n = getN();

int sum = 0;

for(int i=0; i<=n; i++) {

sum += i;

}

return sum;

}

private int getN() { return 10; }

}

//------------------------------------------

public class JMain {

public static void main(String[] args) {

Calculator cal = new Calculator();

System.out.println(cal.run());

}

}

~~ 先不做轮胎(先不加糖) ~~

~~ 先做轮毂(先准备砂糖纸包) ~~

范例代码:

// JMain.java

import Engine.Calculator;

public class JMain {

public static void main(String[] args) {

Calculator cal = new Calculator();

System.out.println(cal.run());

}

}

// 引擎部份

package Engine;

import Framework.ICount;

public class Calculator {

ICount ref;

public int run() {

int n;

n = getN();

int sum = 0;

for(int i=0; i<=n; i++) {

sum += i;

}

return sum;

}

private int getN() {

return ref.getCount();

}

}

// 接口部分

package Framework;

public interface ICount {

int getCount();

}


Java的Interface接口,就相当于纯粹抽象基类(Pure abstract class)。所以,也能将上述ICount接口定义为基类,如下:

abstract class Count {

public abstract int getCount();

}


也可以定义为一般抽象基类,如下:

abstract class Count {

public int getCount() {

int cc = onCount();

return cc;

}

protected int onCount();

}

以上是做『分』的动作,将轮胎从汽车上”分” 离开来,或是将糖从三合一咖啡里分离开来。

客人来了,主人询问客人:需要冰糖或砂糖?

依据客人需求,主人开始做『合』的动作,将轮胎组”合”装配到汽车上,或是将糖加入二合一咖啡,调”合”成可口的咖啡。


4. 开始撰写AP子类别

~~ 配上实作类(Implementation Class):

~~ 配上子类(Sub Class):

~~创建子类的对象~~

范例代码:

// JMain.java

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());

}

}

// 引擎部份

package Engine;

import Framework.Count;

public class Calculator {

private Count ref;

public int run() {

int n;

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();

}

// 子類部份

import Framework.Count;

public class myCount extends Count{

protected int onCount(){ return 10; }

}

*** 這有一個矛盾的地方:

代碼Count co = new myCount(); 意味著myCount類必須先於JMain類。

但是JMain又屬於框架層,顯然應該先於myCount類。

*** 如果使用Android的myActivity子類來替代JMain類,就解決上述的困境了。

*** 於是共含有兩層框架:Android大框架和DSF小框架,如下圖:

總共含有4大模塊:

Android大框架

DSF小框架

DSE特殊領域引擎

AP

范例代码:

// 引擎部份

package DS_Engine;

import DS_Framework.Count;

public class Calculator {

private Count ref;

public int run() {

int n;

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;

}

}

// DSF小框架部份

package DS_Framework;

public abstract class Count {

public int getCount() {

int cc = onCount();

return cc;

}

protected abstract int onCount();

}

// AP部分

// myCount.java

package com.misoo.ppxx;

import DS_Framework.Count;

public class myCount extends Count{

protected int onCount(){ return 10; }

}

// myActivity.java

package com.misoo.ppxx;

import DS_Engine.Calculator;

import DS_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.LinearLayout;

public class myActivity extends Activity implements OnClickListener {

private Button btn, btn2;

@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;

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 101:

Calculator cal = new Calculator();

Count co = new myCount();

cal.setRef(co);

int result = cal.run();

setTitle(String.valueOf(result));

break;

case 102: finish(); break;

}}

}

EE EE