專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)白塔免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
前言:
在軟件開(kāi)發(fā)上,寫(xiě)代碼是<實(shí)>,畫(huà)設(shè)計(jì)圖是<虛>。程序員務(wù)實(shí),設(shè)計(jì)員務(wù)虛。由于<干實(shí)事>被推崇,所以大多開(kāi)發(fā)者都務(wù)實(shí)了,不畫(huà)圖做設(shè)計(jì)了。例如,數(shù)十本仿間的中文Android書(shū)籍里,除了我的書(shū)之外,幾乎沒(méi)有UML圖,讓年輕一代逐漸失去圖形思考習(xí)慣,這將損害其創(chuàng)造能力。
高老師陪您成長(zhǎng)...
EE EE
相關(guān)文章:
1.如何設(shè)計(jì)平臺(tái)框架的<未來(lái)性>
2.平臺(tái)框架(Framework)開(kāi)發(fā)的雕龍之技6招
如何繪制平臺(tái)框架的設(shè)計(jì)圖:使用UML工具
1.復(fù)習(xí):開(kāi)始使用UML建模工具(如JUDE)
開(kāi)啟JUDE建模工具:
點(diǎn)選
建立新的類圖(Class Diagram):
類圖繪圖區(qū):
拉出一個(gè)類的圖像,并取名為 ”汽車(chē)”:
2. 開(kāi)始設(shè)計(jì)框架
框架設(shè)計(jì)練習(xí)口訣:目前先”不”做輪胎
老子說(shuō):”無(wú)” 之以為用(有之以為利)
孔子說(shuō):知之為知之,”不”知為不知
最偉大的雕刻師羅丹( Musée Rodin)說(shuō):把”不”必要的部分去掉。
~~ 先不做輪胎 ~~
相當(dāng)于:
[歡迎光臨 高煥堂 網(wǎng)頁(yè):http://www.cnblogs.com/myEIT/ ]
3. 應(yīng)用框架設(shè)計(jì)范例
這個(gè)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());
}
}
~~ 先不做輪胎(先不加糖) ~~
~~ 先做輪轂(先準(zhǔn)備砂糖紙包) ~~
范例代碼:
// 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接口,就相當(dāng)于純粹抽象基類(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();
}
以上是做『分』的動(dòng)作,將輪胎從汽車(chē)上”分” 離開(kāi)來(lái),或是將糖從三合一咖啡里分離開(kāi)來(lái)。
客人來(lái)了,主人詢問(wèn)客人:需要冰糖或砂糖?
依據(jù)客人需求,主人開(kāi)始做『合』的動(dòng)作,將輪胎組”合”裝配到汽車(chē)上,或是將糖加入二合一咖啡,調(diào)”合”成可口的咖啡。
4.開(kāi)始撰寫(xiě)AP子類別
~~ 配上實(shí)作類(Implementation Class):
~~ 配上子類(Sub Class):
~~創(chuàng)建子類的對(duì)象~~
范例代碼:
// 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; }
}
*** 這有一個(gè)矛盾的地方:
代碼Count co = new myCount(); 意味著myCount類必須先於JMain類。
但是JMain又屬於框架層,顯然應(yīng)該先於myCount類。
*** 如果使用Android的myActivity子類來(lái)替代JMain類,就解決上述的困境了。
*** 於是共含有兩層框架:Android大框架和DSF小框架,如下圖:
總共含有4大模塊:
Android大框架
DSF小框架
DSE特殊領(lǐng)域引擎
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