MVC
1. AndroidのMVCとは何ですか?特徴?
Model
:ビジネスモデル用に確立されたデータ構造とクラス(ビューとは関係なく、ビジネスのみに関連する)View
:XML/JAVA
またはJS+HTML
ページを表示します。Activity/Frgament
ビューの機能も想定しています。Controller
:Android
通常、制御層はその中にありActivity、Fragment
ます。
本質はController
操作Model
層のデータであり、表示の数据
ためにView
層に戻されます。
2. Android MVCの欠点:
Activity
MVC
標準ではありませんがController
、両方のController
義務にView
責任があり、Activity
コードが肥大化しすぎます。View层
そして、Model层
お互いに結合され耦合过重
、代码量过大
開発し、維持することが難しいです。
MVP
3.AndroidのMVPモード
MVP(Model-View-Presenter)
Model
:主にデータストレージ機能を提供します。データPresenter
にModel
アクセスする必要があります。View
:処理を担当します点击事件和视图展示
(Activity、Fragment或者某个View控件
)Presenter
: データを取得した後、レイヤーに戻るView和Model
間のブリッジ。そのため、結合関係はなくなります。Model
View
M/V
4. MVPとMVCの違いは何ですか?(2)
MVP
View
直接アクセスは許可されませんModel
- 本質は
增加了一个接口
1つのレベルを下げることです耦合度
5.MVPの機能
Presenter
完全Model
にView
分離されたメインロジックはPresenter
にあります。Presenter
それは具体View
互いに直接関連しておらず、明確に定義されたものを介して接口
相互作用します。View
変更しても、変更しないでおくことができますPresenter
(オブジェクト指向プログラミングの特性に沿って)View
単純なSet/Get
メソッド、ユーザー入力、インターフェイスに表示されるコンテンツのみが必要であり、それ以上のものはありません。低耦合
:モデルとビューの分離により、この機能が決まります。
6. MVPの利点は何ですか?
- 低結合:モデルレイヤーとビューレイヤーの変換は相互に影響しません。
- 再利用性:モデルレイヤーは複数のビューに使用できます。たとえば、ビデオデータを要求するには、複数のページでこの機能が必要になる場合がありますが、モデルレイヤーコードのコピーは1つだけで十分です。
方便测试
:Model
レイヤーとView
レイヤーを個別にテストできます。
7.MVPのデメリット
MVP
インタフェースは、接続に使用されるview层
とpresenter层
、非常に複雑なロジックを含むページがある場合、インターフェースを維持するための非常に高いコストをもたらす、多くのインターフェースが存在するであろう。解决办法
:可能な限り、いくつかの一般的なインターフェイスが基本クラスとして使用され、他のインターフェイスは継承されます。
8. MVPの実現?
モデルレイヤー
//Model层-数据的实体类:NetInfo.java
public class NetInfo {
private int code;
private String msg;
public NetInfo(int code, String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
//Model层-请求数据时View和Model的交互接口(中间层Presenter去实现):LoadTasksCallBack.java
public interface LoadTasksCallBack<T> {
void onSuccess(T data);
void onFailed();
}
//Model层-任务抽象基类【业务接口】: NetTask.java
public interface NetTask<T> {
void execute(T data, LoadTasksCallBack callBack);
}
/**=============================================
* Model层核心-具体任务【业务的实际操作】:
* 1. 实现Model层获取数据的操作.
* //NetInfoTask.java
*=============================================*/
public class NetInfoTask implements NetTask<String>{
@Override
public void execute(String ip, LoadTasksCallBack callBack) {
if("192.168.1.1".equals(ip)){
callBack.onSuccess(new NetInfo(1, "This is a Msg from " + ip));
}else{
callBack.onFailed();
}
}
}
プレゼンターレイヤー
* 契约接口:
* 存放相同业务的Preenter和View-便于查找和维护
* //NetInfoContract.java
*=============================================*/
public interface NetInfoContract{
//1、Presenter定义了获取数据的方法
interface Presenter{
void getNetInfo(String ip);
}
//2、View中定义了与界面交互的方法
interface View extends BaseView<Presenter> {
void setNetInfo(NetInfo netInfo);
void showError(String msg);
}
}
/**=========================================
* Presenter具体实现:NetInfoPresenter.info
* 1. 分别与View层和Model层Task关联起来(持有了两者的对象)
* 2. 实现接口getNetInfo()用于View层从Model层获取数据
* 3. * 次要实现了Task执行中需要的回调接口-代理完成了View与Model的交互(避免了M/V的直接交互)
*========================================*/
public class NetInfoPresenter implements NetInfoContract.Presenter, LoadTasksCallBack<NetInfo>{
//1. View层
private NetInfoContract.View mView;
//2. Model层任务
private NetTask mNetTask;
//3. 分别与View和Model建立关联
public NetInfoPresenter(NetInfoContract.View view, NetTask netTask){
mNetTask = netTask;
mView = view;
}
//4. 能让View层获取到Model层数据
@Override
public void getNetInfo(String ip) {
mNetTask.execute(ip, this);
}
//5. 实现Model层需要的回调接口-作用是将Model层数据交给View层
@Override
public void onSuccess(NetInfo netInfo) {
mView.setNetInfo(netInfo);
}
@Override
public void onFailed() {
mView.showError("error");
}
}
レイヤーを表示
//BaseView.java
//View层的基类:定义了设置Presenter的接口
public interface BaseView<T> {
void setPresenter(T presenter);
}
//HttpActivity.java
// View层的具体实现:可以是Activity也可以是Fragment
public class HttpActivity extends Activity implements NetInfoContract.View{
//1. 中间代理人
private NetInfoContract.Presenter mPresenter;
Button mGetButton, mSetButton;
TextView mTitleTxtView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity_http);
mGetButton = findViewById(R.id.get_fromnet_button);
mSetButton = findViewById(R.id.set_button);
mTitleTxtView = findViewById(R.id.title_textview);
/**==============================================
* 1、给View层设置Presenter和Model层的Task(获取数据)
*===============================================*/
setPresenter(new NetInfoPresenter(this, new NetInfoTask()));
/**==============================================
* 2、View层通过Presenter去获取数据
*===============================================*/
mGetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//TODO 从网络请求到数据
mPresenter.getNetInfo("192.168.1.1");
}
});
mSetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTitleTxtView.setText("Local Msg = Hello");
}
});
}
/**=====================================
* 3、实现View层的三个接口:设置Presenter和View界面相关功能
*====================================*/
@Override
public void setPresenter(NetInfoContract.Presenter presenter) {
mPresenter = presenter;
}
@Override
public void setNetInfo(NetInfo netInfo) {
mTitleTxtView.setText(netInfo.getMsg());
}
@Override
public void showError(String msg) {
mTitleTxtView.setText(msg);
}
}
public interface LoginMVPContract{
//View接口
public interface ILoginView<T>{
public void showLoginSuccess(T data);
public void showLoginFailed(String errorMsg);
}
//任务接口
public interface ILoginTask{
public void startLogin(String phoneNumber, ILoginCallBack callback);
}
//Presenter
public interface ILoginPresenter{
public void startLogin(String phoneNumber);
}
//Presenter和Task间交互的接口
public interface ILoginCallBack<T>{
public void onLoginSuccess(T data);
public void onLoginFailed(String errorMsg);
}
}
2.モデルのLoginResultBeanおよびLoginTask.java
public class LoginResultBean {
}
public class LoginTask implements LoginMVPContract.ILoginTask{
@Override
public void startLogin(String phoneNumber, LoginMVPContract.ILoginCallBack callback) {
if(true){
callback.onLoginSuccess(new LoginResultBean());
}else{
callback.onLoginFailed("登录失败");
}
}
}
3、プレゼンター
public class LoginPresenter implements LoginMVPContract.ILoginPresenter, LoginMVPContract.ILoginCallBack{
LoginMVPContract.ILoginView mLoginView;
LoginMVPContract.ILoginTask mTask;
public LoginPresenter(LoginMVPContract.ILoginView loginView, LoginMVPContract.ILoginTask task){
mLoginView = loginView;
mTask = task;
}
/**
* 接口回调至
*/
@Override
public void onLoginSuccess(Object data) {
mLoginView.showLoginSuccess(data);
}
@Override
public void onLoginFailed(String errorMsg) {
mLoginView.showLoginFailed(errorMsg);
}
@Override
public void startLogin(String phoneNumber) {
mTask.startLogin(phoneNumber, this);
}
}
4、表示
public class LoginFragment extends SupportFragment implements LoginMVPContract.ILoginView<LoginResultBean>{
LoginMVPContract.ILoginPresenter mLoginPresenter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLoginPresenter = new LoginPresenter(this, new LoginTask());
mLoginPresenter.startLogin("17777777777");
}
@Override
public void showLoginSuccess(LoginResultBean data) {
//登陆成功
}
@Override
public void showLoginFailed(String errorMsg) {
//登录失败
}
}
9.MVPファイルの量を最適化する方法
泛型
でmodel、view、presenter
定義される定義コントラクトクラスを使用します契约类中
- 構造は明確で、1つは1つに
契约类
対応し业务模块
ます。
MVVM
10. MVVMモデルの役割と特徴は?
Model-View-ViewModel
、にPresenter
置き換えられViewModel
ます。ViewModel
そしてModel/View
、双方向バインディングを実行しました。View
変更がある場合は、データの更新をViewModel
通知Model
しますModel
データが更新されると、更新表示ViewModel
が通知されますView
- Googleがリリースし
MVVM
サポートライブラリをData Binding
:にデータをバインドすることができますxml
- 現在、Googleは
ViewModel和LiveData
より便利な実装のためのコンポーネントを導入していますMVVM
MVVM
モジュール化とコンポーネント化
11.モジュール性とは
- 一種
软件设计技术
项目
機能が分割され独立
、可交换
モジュール- それぞれ
模块
にの実行单独功能
が含まれてい必要内容
ます。
12.コンポーネント化とは
- コンポーネントソフトウェアエンジニアリングは、コンポーネント開発とも呼ばれ、ソフトウェアエンジニアリングの一分野です。
- ソフトウェアシステムを独立したコンポーネントに分割することを強調します(コンポーネントはモジュールやWebリソースなどです)。
13.モジュール性とコンポーネント化の違い
- 両方の目的は
重用和解耦
- 主に
叫法不同
模块化
再利用に焦点を当て、组件化
さらに业务解耦
14.コンポーネント化の利点
- コンポーネント間の柔軟なアセンブリ
组件
変更は、限り对外提供的接口
変更はありません、ん其他组件
テストする必要がありません。- 短所:技術的およびビジネス的理解に対するより高い要件。
15.モジュラー階層分割
- 基本ライブラリ
- 一般的なビジネスレイヤー
- アプリケーション層
16.モジュール間の通信
- 自分で実装することもできますが、もっと面倒です
- 提案された
阿里巴巴
オープンソースライブラリ。
好きなものを読んだ後、習慣を身につけ、WeChatで「ProgrammingApe Development Center」を検索して、乾物を書くのが好きなこのプログラマーをフォローしてください。
さらに、Androidのファーストラインインタビュー用の完全なテストサイトがあり、情報は私のGiteeで更新されます。インタビューが必要な友人はそれらを参照できます。それがあなたに役立つ場合は、スターを注文できます!
ギティーの住所:[オールドチェンのギティー]