主頁 > 軟體設計 > Android 架構MVC MVP MVVM+實體

Android 架構MVC MVP MVVM+實體

2021-08-19 07:15:03 軟體設計

前言

MVC、MVP和MVVM是軟體比較常用的三種軟體架構,這三種架構的目的都是分離,避免將過多的邏輯全部堆積在一個類中,

在Android中,Activity中既有UI的相關處理邏輯,又有資料獲取邏輯,從而導致Activity邏輯復雜不單一難以維護,

為了一個應用可以更好的維護和擴展,我們需要很好的區分相關層級,要不然以后將資料獲取方式從資料庫變為網路獲取時,我們需要去修改整個Activity,架構使得View和資料相互獨立,我們把應用分成三個不同層級,這樣我們就能夠單獨測驗相關層級,使用架構能夠把大多數邏輯從Activity中移除,方便進行單元測驗,

MVC是什么?

MVC是模型(Model)-視圖(View)-控制器(Controller)的縮寫,用一種業務邏輯、資料、界面顯示分離的方法組織代碼,其實Android Studio創建一個專案的模式就是一個簡化的mvc模式,

Android中的MVC含義

  • Model:物體類(資料的獲取、存盤、資料狀態變化),

  • View:布局檔案

  • Controller:Activity(處理資料、業務和UI),

作業原理

  • 1.View接受用戶的互動請求,

  • 2.View將請求轉交給Controller,

  • 3.Controller操作Model進行資料更新,

  • 4.資料更新之后,Model通知View資料變化,

  • 5.View顯示更新之后的資料,

MVC的缺點

隨著界面及其邏輯的復雜度不斷提升,Activity類的職責不斷增加,以致變得龐大臃腫,

為了解決MVC的缺點,MVP 框架被提出來,

MVP是什么

MVP是MVC架構的一個演化版,全稱是Model-View-Presenter,將MVC中的V和C結合生成MVP中的V,引入新的伙伴Presenter,

Android中的MVP含義

  • Model:物體類(資料的獲取、存盤、資料狀態變化),

  • View:布局檔案+Activity,

  • Presenter:中介,負責完成View與Model間的互動和業務邏輯,

作業原理

  • 1.View 接收用戶互動請求

  • 2.View 將請求轉交給 Presenter(V呼叫P介面)

  • 3.Presenter 操作Model進行資料更新(P呼叫M介面)

  • 4.Model 通知Presenter資料發生變化(M呼叫P介面)

  • 5.Presenter 更新View資料(P執行介面,V相應回呼)

MVP的優點

  • 1.復雜的邏輯處理放在Presenter進行處理,減少了Activity的臃腫,

  • 2.解耦,Model層與View層完全分離,修改V層不會影響M層,降低了耦合性,

  • 3.可以將一個Presenter用于多個視圖,而不需要改變Presenter的邏輯,

  • 4.Presenter層與View層的互動是通過介面來進行的,便于單元測驗,

MVP的缺點

維護困難,Presenter中除了業務邏輯以外,還有大量的View->Model,Model->View的手動同步邏輯,造成Presenter比較笨重,維護起來會比較困難,

MVVM是什么

是 Model-View-ViewModel 的簡寫,MVVM與MVP的結構還是很相似的,就是將Presenter升級為ViewModel,在MVVM中,View層和Model層進行了雙向系結(即Data Binding),所以Model資料的更改會表現在View上,反之亦然,ViewModel就是用來根據具體情況處理View或Model的變化,

Android中的MVVM含義

  • Model:物體類(資料的獲取、存盤、資料狀態變化),

  • View:布局檔案+Activity,

  • ViewModel: 關聯層,將Model和View進行系結,Model或View更改時,實時重繪對方,

作業原理

  • 1.View 接收用戶互動請求

  • 2.View 將請求轉交給ViewModel

  • 3.ViewModel 操作Model資料更新

  • 4.Model 更新完資料,通知ViewModel資料發生變化

  • 5.ViewModel 更新View資料

View/Model的變動,只要改其中一方,另一方都能夠及時更新到

MVVM的優點

  • 1.提高可維護性,Data Binding可以實作雙向的互動,使得視圖和控制層之間的耦合程度進一步降低,分離更為徹底,同時減輕了Activity的壓力,

  • 2.簡化測驗,因為同步邏輯是交由Binder做的,View跟著Model同時變更,所以只需要保證Model的正確性,View就正確,大大減少了對View同步更新的測驗,

  • 3.ViewModle易于單元測驗,

MVVM的缺點

  • 1.對于簡單的專案,使用MVVM有點大材小用,

  • 2.對于過大的專案,資料系結會導致記憶體開銷大,影響性能,

  • 3.ViewModel和View的系結,使頁面例外追蹤變得不方便,有可能是View出錯,也有可能是ViewModel的業務邏輯有問題,也有可能是Model的資料出錯,

MVP和MVC的最大區別

在MVP中View并不直接使用Model,它們之間的通信是通過Presenter 來進行的,所有的互動都發生在Presenter內部,而在MVC中View直接從Model中讀取資料而不是通過 Controller,

如何選取框架

本來是要每個模式寫一個適用場景,最后想想每個人都有自己的理解,別被他人束縛了,

一句話:適合自己的才是最好的!

實體

就這么一個界面咱通過MVC、MVP、MVVM分別搭建一下,

MVC實體

代碼結構

1.在layout創建一個布局檔案

    <!--縮減版-->
    <LinearLayout
        ...>
        <EditText
            android:id="@+id/et_account"
            .../>
    </LinearLayout>
    <LinearLayout
        ...>
        <EditText
            android:id="@+id/et_password"
            .../>
    </LinearLayout>
    <Button
        android:id="@+id/btn_login"
        .../>
    <Button
        android:id="@+id/btn_back"
        .../>

2.物體類(User)

public class User {
    private String name;
    private String password;
    public User() {}
    //set or get ...
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

3.MVCLoginActivity

//用戶點擊事件
mvcBinding.mcvLogin.btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user.setName(mvcBinding.mcvLogin.etAccount.getText().toString());
                user.setPassword(mvcBinding.mcvLogin.etPassword.getText().toString());
                login(user);
            }
});
//邏輯處理
private void login(User user){
        if(!user.getName().isEmpty()&&!user.getPassword().isEmpty()){
            if(user.getName().equals("scc001")&&user.getPassword().equals("111111"))
            {
                Toast.makeText(this,"登錄成功",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this,"登錄失敗",Toast.LENGTH_SHORT).show();
            }
        }else {
            Toast.makeText(this,"登錄失敗",Toast.LENGTH_SHORT).show();
        }
    }

MVP實體

代碼結構

1.Model層

物體類bean,同MVC中的User類,就不貼代碼浪費大家時間了,

Model層所要執行的業務邏輯

/**
  * 功能:介面,表示Model層所要執行的業務邏輯
  */
public interface LoginModel {
    //User物體類;OnLoginFinishedListener presenter業務邏輯的回傳結果
    void login(User user, OnLoginFinishedListener listener);
}

實作類(實作LoginModel介面)

/**
  * 功能:實作Model層邏輯
  */
public class LoginModelImpl implements LoginModel {
    //第4步:驗證帳號密碼
    @Override
    public void login(User user, OnLoginFinishedListener listener) {
        if(user.getName().isEmpty()||!user.getName().equals("scc001")){
            //第5步:Model層里面回呼Presenter層listener
            listener.onUserNameError();
        }else if(user.getPassword().isEmpty()||!user.getPassword().equals("111111")){
            //第5步:Model層里面回呼Presenter層listener
            listener.onPasswordError();
        }else {
            //第5步:Model層里面回呼Presenter層listener
            listener.onSuccess();
        }
    }
}

2.Presenter層

當Model層得到請求的結果,回呼Presenter層,讓Presenter層呼叫View層的介面方法,

/**
  * 功能:當Model層得到請求的結果,回呼Presenter層,讓Presenter層呼叫View層的介面方法,
  */
public interface OnLoginFinishedListener {
    void onUserNameError();

    void onPasswordError();

    void onSuccess();
}

完成登錄的驗證,以及銷毀當前View,

/**
  * 功能:登錄的Presenter的介面,實作類為LoginPresenterImpl,
  * 完成登錄的驗證,以及銷毀當前View,
  */
public interface LoginPresenter {
    //完成登錄的驗證
    void verifyData(User user);
    //銷毀當前View
    void onDestroy();
}

Presenter實作類,引入 LoginModel(model)和LoginView(view)的參考

/**
  * 功能:實作類,引入 LoginModel(model)和LoginView(view)的參考
  */
public class LoginPresenterImpl implements OnLoginFinishedListener, LoginPresenter {
    //View層介面
    private LoginView loginView;
    //Model層介面
    private LoginModel loginModel;

    public LoginPresenterImpl(LoginView loginView) {
        this.loginView = loginView;
        this.loginModel = new LoginModelImpl();
    }
    //第6步:通過OnLoginFinishedListener驗證結果回傳到Presenter層
    @Override
    public void onUserNameError() {
        if (loginView != null) {
            //第7步:通過loginView回傳到View層
            loginView.setUserNameError();
            loginView.hideProgress();
        }

    }
    //第6步:通過OnLoginFinishedListener驗證結果回傳到Presenter層
    @Override
    public void onPasswordError() {
        if (loginView != null) {
            //第7步:通過loginView回傳到View層
            loginView.setPasswordError();
            loginView.hideProgress();
        }
    }
    //第6步:通過OnLoginFinishedListener驗證結果回傳到Presenter層
    @Override
    public void onSuccess() {
        if (loginView != null) {
            //第7步:通過loginView回傳到View層
            loginView.success();
            loginView.hideProgress();
        }
    }


    @Override
    public void verifyData(User user) {
        if (loginView != null) {
            loginView.showProgress();
        }
        //第3步:呼叫model層LoginModel介面的login()方法
        loginModel.login(user,this);
    }

    @Override
    public void onDestroy() {
        loginView = null;
    }
}

3.View層

布局檔案同MVC中的View層,就不貼代碼浪費大家時間了,

Presenter與View互動是通過介面,

/**
  * 功能:Presenter與View互動是通過介面,
  * 介面中方法的定義是根據Activity用戶互動需要展示的控制元件確定的,
  */
public interface LoginView {
    //login是個耗時操作,加載中(一般用ProgressBar)
    void showProgress();
    //加載完成
    void hideProgress();
    //login賬號失敗給出提示
    void setUserNameError();
    //login密碼失敗給出提示
    void setPasswordError();
    //login成功
    void success();
}

MVPLoginActivity

/**
  * 功能:需要實作LoginView介面,
  */
public class MVPLoginActivity extends AppCompatActivity implements LoginView {
    LoginPresenterImpl loginPresenterImpl;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        ...
        //創建一個Presenter物件
        loginPresenterImpl = new LoginPresenterImpl(MVPLoginActivity.this);
        //第1步:用戶點擊登錄
        mvpBinding.mvpLogin.btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                User user = new User();
                user.setName(mvpBinding.mvpLogin.etAccount.getText().toString());
                user.setPassword(mvpBinding.mvpLogin.etPassword.getText().toString());
                //第2步:呼叫Presenter介面中的驗證方法
                loginPresenterImpl.verifyData(user);
            }
        });
    }

    @Override
    public void showProgress() {
        //加載中
    }

    @Override
    public void hideProgress() {
        //加載完成
    }

    @Override
    public void setUserNameError() {
        //第7步:通過loginView回傳到View層
        //賬號錯誤
        Toast.makeText(this,"登錄失敗",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void setPasswordError() {
        //第7步:通過loginView回傳到View層
        //密碼錯誤
        Toast.makeText(this,"登錄失敗",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void success() {
        //第7步:通過loginView回傳到View層
        Toast.makeText(this,"登錄成功",Toast.LENGTH_SHORT).show();
        //登錄成功
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        loginPresenterImpl.onDestroy();
    }
}

MVVM實體

1.Model層

物體類bean,同MVC中的User類,就不貼代碼浪費大家時間了,

2.ViewModel層

ViewModel類,繼承自ViewModel

public class LoginViewModel extends ViewModel {
    public ViewDataBinding binding;
    public LoginViewModel(ViewDataBinding binding){
        this.binding = binding;
    }
    public void getUser(String userName, String password, Callback callback) {
        //邏輯處理
        User user = new User();
        user.setPassword("111111");
        if(userName.isEmpty()||!userName.equals("scc001")){
            user.setName("scc005");
        }else if(password.isEmpty()||!password.equals("111111")){
            user.setName("scc004");
        }else {
            user.setName("scc003");
        }
        callback.onCallBack(user);
    }
}

ViewModel與View互動

/**
  * 功能:ViewModel與View互動,
  */
public interface Callback<T> {
    void onCallBack(T t);
}

3.View層

先看布局檔案,布局檔案使用了DataBinding,

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <!--為引入的類從新起一個變數名,方便下面使用-->
        <variable
            name="user"
            type="com.scc.architecture.mvvm.model.User" />
    </data>
 <!--刪減版-->
    <LinearLayout
        ...>

        <LinearLayout
            ...>

            <EditText
                android:id="@+id/et_account"
                ...
                android:text="@={user.name}" />
        </LinearLayout>

        <LinearLayout
            ...>

            <EditText
                android:id="@+id/et_password"
                ...
                android:text="@={user.password}" />
        </LinearLayout>

        <Button
            android:id="@+id/btn_login"
            .../>

        <Button
            android:id="@+id/btn_back"
            .../>
    </LinearLayout>

</layout>

本來Button點擊事件也想用databinding去做,后來覺得這個是MVP模式就忽略了這個知識點,感興趣的可以自己搗鼓一下,databinding還是挺好玩的,

MVVMLoginActivity

public class MVVMLoginActivity extends AppCompatActivity {
    private LoginViewModel loginVM;
    ActivityMvvmBinding mvvmBinding;
    private EditText et_account,et_password;
    private Button btn_login,btn_back;
    private TextView tv_title;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mvvmBinding = DataBindingUtil.setContentView(this, R.layout.activity_mvvm);
        et_account =findViewById(R.id.et_account);
        et_password =findViewById(R.id.et_password);
        btn_login = findViewById(R.id.btn_login);
        tv_title = findViewById(R.id.tv_title);
        tv_title.setText("MVVM");

        loginVM = new LoginViewModel(mvvmBinding);
        User user = new User( "scc001", "111111");
        mvvmBinding.setUser(user);//設定et_account:scc001|et_password:111111
        //第1步:用戶點擊登錄
        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login(et_account.getText().toString(),et_password.getText().toString());
            }
        });
    }
    private void login(String name,String password) {
        loginVM.getUser(name,password, new Callback<User>() {
            @Override
            public void onCallBack(User user) {
                mvvmBinding.setUser(user);//同步設定控制元件
            }
        });
    }
}

寫到這里MVC、MCP、MVVM和實體基本寫完了,但是感覺自己理解的不是很好,有大佬能指點就更好了,最后,希望對你有借鑒意義,

實體傳送門

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294676.html

標籤:其他

上一篇:使用Docker搭建nginx靜態資源服務

下一篇:微服務架構師-docker私有鏡像倉庫的配置和使用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more