編輯:關於Android編程
MVP(Model-View-Presenter) 是總所周知MVC模式的一個演變,他們的主要目的都是劃分模塊職責,降低模塊耦合,易測試,提高代碼復用,這裡主要針對Android平台來簡單分析MVP.
1.層級責任
Model: 負責數據的檢索,持久化等操作
View: 負責UI的繪制和用戶的交互
Presenter: 作為Model和View的中間協調部分,負責兩者之間的業務邏輯處理
2.與MVC模式的區別
MVP模式與MVC模式從層級數據流向上來說一個主要的區別應該就是:MVC模式允許View層和Model層直接通訊.從圖1和圖2可以看到MVP和MVC的區別.
圖1MVC模式中Model可以直接update data 到View層。所以當某個View的功能很復雜的時候,View和Model的耦合度可能會很高(並且在android的開發中Activity通常會充當controller&view的角色,結果Activity就很臃腫).而MVP模式就沒有這個問題,View會抽象出來一系列操作UI的接口(Model層也可以),Presenter拿到的都是其他兩個層級的接口來做業務邏輯的處理.這樣不僅可以使View和Model之間的耦合度降低,還可以更易得進行單元測試.
圖1:MVC模式
圖2:MVP模式
3.MVP的優缺點
優點:降低耦合,層級職責更明顯,易於單元測試
缺點:造成類數量爆炸,代碼復雜度和學習成本高,在某些場景下presenter的復用會產生接口冗余
1.項目結構
2.Model層
包含有一個實體UserBean用來承載數據和UserBiz來對登陸數據判斷
public class UserBean { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
UserBiz通過抽象出一個接口
public interface UserBiz { public void login(UserBean login); }
public class UsrBizImpl implements UserBiz{ private OnLoginListener listener; public UsrBizImpl(OnLoginListener listener){ this.listener = listener; } @Override public void login(UserBean login) { boolean status = false; String username,password; username = login.getUsername(); password = login.getPassword(); if (username != null && "asdf".equals(username)) if (password != null && "123".equals(password)) status = true; listener.loginStatus(status); } }
把View層針對控件操作抽象出來一些列的接口
public interface LoginView { public String getUsername(); public String getPassword(); public void clearUsername(); public void clearPassword(); public void showMsg(String msg); }
public class LoginActivity extends Activity implements LoginView{ private EditText username, password; private Button login, clear; private LoginPresenter loginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); init(); } private void init(){ loginPresenter = new LoginPresenterImpl(this); username = (EditText) findViewById(R.id.username); password = (EditText) findViewById(R.id.pass); login = (Button) findViewById(R.id.login); clear = (Button) findViewById(R.id.clear); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loginPresenter.login(); } }); clear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loginPresenter.clear(); } }); } @Override public String getUsername() { return username.getText().toString(); } @Override public String getPassword() { return password.getText().toString(); } @Override public void clearUsername() { username.setText(""); } @Override public void clearPassword() { password.setText(""); } @Override public void showMsg(String msg) { Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } }
在Presenter層裡面,Presenter掌握著View和Model的所有接口,Presenter就可以根據不同的業務邏輯通過MV兩層的接口來實現特定的功能,讓M和V獨立出來.
public class LoginPresenterImpl implements LoginPresenter, OnLoginListener{ private UserBiz userBiz; private LoginView loginView; public LoginPresenterImpl(LoginView loginView){ this.loginView = loginView; userBiz = new UsrBizImpl(this); } @Override public void login() { UserBean login = new UserBean(); login.setUsername(loginView.getUsername()); login.setPassword(loginView.getPassword()); userBiz.login(login); } @Override public void clear() { loginView.clearPassword(); loginView.clearUsername(); } @Override public void loginStatus(boolean status) { String msg; if (status) msg = "login succeed"; else msg = "login failed"; loginView.showMsg(msg); } }
CSDN下載
簡單得用了下MVP,也有跟朋友討論了一下,好多人都說這個看著挺不錯的,但是用著很麻煩。確實現在Android項目用MVP的不是占多數,帶著一些疑惑樓主就想去了解一下android原生程序裡面是用的什麼風格的,之前也有看過一些android源碼,但是都是斷斷續續的,也好久沒有寫過博客了,本著對技術的熱愛,計劃重新開啟撸android源碼的計劃(從Android原生的系統程序到framework再一路向下),現在希望自己能夠堅持下來,並且產出一個博客的系列和大家一起分享和成長.
在Android中,視圖控件大致被分為兩類,即ViewGroup和View,ViewGroup控件作為父控件,包含並管理著子View,通過ViewGroup和View便形
今天主要添加了一個換膚的功能,可以切換6種不同的背景,即點擊“換膚”按鈕可以實現切換背景圖片。 這個我在網上搜了好長時間,最終最靠譜和好理解的應該是下面這個鏈接裡的方法:
之前一篇文章研究完橫向二級菜單,發現其中使用了SparseArray去替換HashMap的使用.於是乎自己查了一些相關資料,自己同時對性能進行了一些測試。首先先說一下Sp
一、開發背景:我目前在做的是一個3年左右的老項目,項目開始的時候okhttp還不像現在這麼火,基本上使用HttpURLConnection類來實現所有的HTTP請求,當時