參考:web
http://www.jianshu.com/p/50c7124f408e數據庫
http://www.jianshu.com/p/7c4e310da409編程
http://blog.csdn.net/qq_31852701/article/details/52946127ide
MVP模式的代碼的,寫好了去看,沒什麼難度,可是若是本身去寫,就感受很不適應,主要仍是編程思想要有一些轉變 ,仍是須要本身寫一下測試
Model,View,Presenter三者之間的關係是:View和Model之間沒有聯繫,View經過接口向Presenter來傳遞用戶操做,Model不主動和Presenter聯繫,被動的等着Presenter來調用其接口,Presenter經過接口和View/Model來聯繫。ui
View <- 接口 <- Presenter ->接口 -> Modelthis
View -> 接口 -> Presenter <- 接口 <- Modelspa
參考連接:http://www.jianshu.com/p/50c7124f408e.net
VIEW:翻譯
interface IUserView { void setPresenter(presenter); void showUsers(users); void showDeleteUserComplete(); void showDeleteUserError(); } class UserView implements IUserView { UserPresenter presenter; // 保持對Presenter的引用,用於路由用戶操做 void setPresenter(presenter) { this.presenter = presenter; } // 將Presenter傳遞來的數據展現出來 void showUsers(users) { draw(users); } // Model操做數據成功後,經過Presenter來告之View須要更新用戶界面 void showDeleteUserComplete() { alert("Delete User Complete"); } // Model操做數據失敗後,也是經過Presenter來告之View須要更新用戶界面 void showDeleteUserError() { alert("Delete User Fail"); } // 當用戶點擊某個按鈕時,將用戶操做路由給presenter,由presenter去處理 void onDeleteButtonClicked(event) { presenter.deleteUser(event); } }
Model:
interface IUserModel { List<User> getUsers(); boolean deleteUserById(); } class UserModel implements IUserModel { // 在數據庫裏查找數據,並將數據返回給presenter List<User> getUsers() { return getUsersInDatabase(id); } // 在數據庫裏刪除數據,並將結果返回給presenter User deleteUserById(id) { return deleteUserByIdInDatabase(id); } }
Presenter
interface IUserUserPresenter { void deleteUser(event); } class UserUserPresenter implements IUserPresenter { // 保持對View的引用 IUserView view; // 保持對Model的引用 IUserModel model; UserUserPresenter(IUserView view, IUserModel model) { this.view = view; this.model = model; this.view.setPresenter(this); } void start() { // 從Model中取出數據 List<User> users = model.getUsers(); // 將數據發送給View,讓其展現到用戶界面 view.showUsers(users); } void deleteUser(event) { // View將用戶操做路由過來,由Presenter來處理 long uid = whichUserNeedToDeleteBy(event); // 將用戶操做翻譯成命令或消息傳遞給model,以改變數據 boolean success = model.deleteUserById(uid); // 將Model操做數據後的結果通知View來改變用戶界面 if (success) { view.onDeleteUserSuccess(); } else { view.onDeleteUserFail(); } } }
MODE
package s.com.mvp; public interface IBaseModel{ String getData(); } public class BaseModel implements IBaseModel{ String textData = "這是測試數據"; @Override public String getData() { return textData; } }
VIEW
package s.com.mvp; public interface IBaseView { //初始化Presenter void initPresenter(BasePresenter presenter); //顯示數據 void showMsg(String s); void showTest(); } public class MainActivity extends AppCompatActivity implements IBaseView{ private String TAG = "MainActivity"; BasePresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initPresenter(new BasePresenter(this)); presenter.start(); } @Override public void initPresenter(BasePresenter presenter) { this.presenter = presenter; } @Override public void showMsg(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show(); } @Override public void showTest() { Toast.makeText(MainActivity.this, "成功!!!!!", Toast.LENGTH_SHORT).show(); } }
Presenter:
package s.com.mvp; public interface IBasePresenter { //NONE } public class BasePresenter implements IBasePresenter{ private String TAG = "BasePresenter"; IBaseModel mModel; IBaseView mView; public BasePresenter(IBaseView mView){ this.mView = mView; mModel = new BaseModel(); this.mView.showTest(); } public void start(){ String s = mModel.getData(); mView.showMsg(s); } }
實現MVP的三個接口
IBuyBookModel
IBuyBookPresenter
IBuyBookView
實現MVP的兩個抽象類(也就是具備共性,不須要修改的抽象類)
BaseActivity
BasePresenter
上面的接口和抽象類的具體實現類
BuyBookActivity
BuyBookModel
BuyBookPresenter
參考資料:http://blog.csdn.net/qq_31852701/article/details/52946127