這個(gè)問(wèn)題,首先看你的架構(gòu),一切以基于你的系統(tǒng)結(jié)構(gòu)為依據(jù),否則就是在扯淡;

創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)站營(yíng)銷推廣,域名與空間,網(wǎng)絡(luò)空間,網(wǎng)站改版維護(hù)有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問(wèn)題,請(qǐng)聯(lián)系創(chuàng)新互聯(lián)。
任何基于mvc的系統(tǒng),c是一個(gè)完整獨(dú)立的,怎么會(huì)要在activity里處理大量的業(yè)務(wù)邏輯呢?
你提這個(gè)問(wèn)題,明顯已經(jīng)進(jìn)入一個(gè)誤區(qū)了。
嚴(yán)格來(lái)講在android,activity和intent起到了controller的角色,所以很明顯業(yè)務(wù)邏輯不應(yīng)該放在activity里。
放在系統(tǒng)結(jié)構(gòu)來(lái)看,controller肯定你要單獨(dú)自己抽出來(lái),而不是都放在一個(gè)activity里,除非你的項(xiàng)目就一個(gè)activity,即使項(xiàng)目很簡(jiǎn)單我也建議你抽出單獨(dú)的controller。
l模型(model)對(duì)象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫(xiě)在該層。
l視圖(view)對(duì)象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個(gè)mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。
l控制器(control)對(duì)象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對(duì)象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,想用用戶出發(fā)的相關(guān)事件,交給m哦得了處理。
MVC的架構(gòu)模式是在開(kāi)發(fā)中最常用到的,下面分享一下我對(duì)MVC架構(gòu)模式的理解。
MVC全稱是Model View Controller。
在實(shí)際開(kāi)發(fā)中, Model 層就是 JavaBean 實(shí)體類,用于保存實(shí)例數(shù)據(jù);View 層其實(shí)就是程序的 UI 界面,用于向用戶展示數(shù)據(jù)以及接收用戶的輸入;Controller 控制器用于更新 UI 界面和數(shù)據(jù)實(shí)例。
用MVC架構(gòu)模式實(shí)現(xiàn)登錄有關(guān)的案例:
這個(gè)是個(gè)人習(xí)慣,我一般是使用小刀注解和支持Java8。
這是最簡(jiǎn)單的MVC案例,希望對(duì)想要了解的MVC的小伙伴有幫助。
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě),一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫(xiě)業(yè)務(wù)邏輯。其中M層處理數(shù)據(jù),業(yè)務(wù)邏輯等;V層處理界面的顯示結(jié)果;C層起到橋梁的作用,來(lái)控制V層和M層通信以此來(lái)達(dá)到分離視圖顯示和業(yè)務(wù)邏輯層。
在Android開(kāi)發(fā)中,比較流行的開(kāi)發(fā)框架模式采用的是MVC框架模式,采用MVC模式的好處是便于UI界面部分的顯示和業(yè)務(wù)邏輯,數(shù)據(jù)處理分開(kāi)。那么Android項(xiàng)目中哪些代碼來(lái)充當(dāng)M,V,C角色呢?
M層:適合做一些業(yè)務(wù)邏輯處理,比如數(shù)據(jù)庫(kù)存取操作,網(wǎng)絡(luò)操作,復(fù)雜的算法,耗時(shí)的任務(wù)等都在model層處理。這個(gè)和JavaEE不太一樣,javaee中model層一般只有模型,而復(fù)雜的操作一般放在業(yè)務(wù)(service)層中。
V層:應(yīng)用層中處理數(shù)據(jù)顯示的部分,XML布局可以視為V層,顯示Model層的數(shù)據(jù)結(jié)果。
C層:在Android中,Activity處理用戶交互問(wèn)題,因此可以認(rèn)為Activity是控制器,Activity讀取V視圖層的數(shù)據(jù)(eg.讀取當(dāng)前EditText控件的數(shù)據(jù)),控制用戶輸入(eg.EditText控件數(shù)據(jù)的輸入),并向Model發(fā)送數(shù)據(jù)請(qǐng)求(eg.發(fā)起網(wǎng)絡(luò)請(qǐng)求等)。
用MVC進(jìn)行重構(gòu),例:
Step1:抽取所有界面元件的聲明和定義,整合到單獨(dú)一個(gè)函數(shù)findViews()中;
// 聲明
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
此部分即是MVC中的V:View視圖。
Step2:抽取程序的邏輯(即界面元件的處理邏輯),整合到函數(shù)setListensers()中;
//Listen for button clicks
private void setListensers() {
button_calc.setOnClickListener(calcBMI);
}
此部分即是MVC中的C:Controller控制器。
接著,onCreate()就顯得非常簡(jiǎn)潔、明了了:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
Step3:修改按鈕監(jiān)聽(tīng)器calcBMI中相應(yīng)的部分(主要是變量已經(jīng)在視圖部分定義了);
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText("Your BMI is " + nf.format(BMI));
// Give health advice
if (BMI 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
Step4:修剪一下“細(xì)枝末節(jié)”;
1) calcBMI的修改:
private OnClickListener calcBMI = new OnClickListener() {
……
}
改成如下:
private Button.OnClickListener calcBMI = new Button.OnClickListener() {
……
}
gasolin的解釋是:
同樣是「calcBMI」 函式,在完整程式中,改將「calcBMI」 函式從原本的「OnClickListener」宣告成 「Button.OnClickListener」。這個(gè)改變有什麼差別呢?
閱讀原本的程式碼,在匯入(import)的部分可以看到,「OnClickListener」是來(lái)自於「android.view.View.OnClickListener」函式:
import android.view.View.OnClickListener;
改成 「Button.OnClickListener」後,「Button.OnClickListener」就變成來(lái)自於「android.widget.Button」中的「OnClickListener」函式,在查閱程式時(shí),整個(gè)「Button」與「OnClickListener」之間的關(guān)系變得更清晰。
2) 字符串統(tǒng)一引用XML中的描述符:
//Present result
view_result.setText("Your BMI is " + nf.format(BMI));
改成如下:
//Present result
view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
總之,此重構(gòu)的目的無(wú)非是使程序的脈絡(luò)更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應(yīng)該寫(xiě)在哪里,程序邏輯(Controller)應(yīng)該寫(xiě)在哪里,最終使維護(hù)和擴(kuò)展代碼變得更加容易!
重構(gòu)前的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
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.TextView;
public class Bmi extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Listen for button clicks
Button button = (Button) findViewById(R.id.submit);
button.setOnClickListener(calcBMI);
}
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
EditText fieldheight = (EditText) findViewById(R.id.height);
EditText fieldweight = (EditText) findViewById(R.id.weight);
double height = Double.parseDouble(fieldheight.getText().toString()) / 100;
double weight = Double.parseDouble(fieldweight.getText().toString());
double BMI = weight / (height * height);
TextView result = (TextView) findViewById(R.id.result);
result.setText("Your BMI is " + nf.format(BMI));
// Give health advice
TextView fieldsuggest = (TextView) findViewById(R.id.suggest);
if (BMI 25) {
fieldsuggest.setText(R.string.advice_heavy);
} else if (BMI 20) {
fieldsuggest.setText(R.string.advice_light);
} else {
fieldsuggest.setText(R.string.advice_average);
}
}
};
}
2) 重構(gòu)后的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Bmi extends Activity {
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
// Listen for button clicks
private void setListeners() {
calcbutton.setOnClickListener(calcBMI);
}
private Button.OnClickListener calcBMI = new Button.OnClickListener() {
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.0");
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
// Give health advice
if (BMI 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
}
MVC、MVP和MVVM是常見(jiàn)的三種架構(gòu)設(shè)計(jì)模式,當(dāng)前MVP和MVVM的使用相對(duì)比較廣泛,當(dāng)然MVC也并沒(méi)有過(guò)時(shí)之說(shuō)。
MVC (Model-View-Controller, 模型-視圖-控制器),標(biāo)準(zhǔn)的MVC是這個(gè)樣子的:
簡(jiǎn)述:
缺點(diǎn):
MVP (Model-View-Presenter) 是MVC的演化版本,幾個(gè)主要部分如下:
簡(jiǎn)述:
解釋:
優(yōu)點(diǎn):
缺點(diǎn):
MVVM 是 Model-View-ViewModel 的簡(jiǎn)寫(xiě)。和 MVP 模式相比,MVVM 模式用 ViewModel 替換了 Presenter ,其他層基本上與 MVP 模式一致,ViewModel 可以理解成 是 View 的數(shù)據(jù)模型和 Presenter 的合體。MVVM 就是將其中的 View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開(kāi)。
簡(jiǎn)述:
缺點(diǎn):
參考:
本文名稱:android的mvc,Android Android
分享網(wǎng)址:http://chinadenli.net/article2/dsgseoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)、品牌網(wǎng)站制作、商城網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)