自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解密 Android 開發(fā)中的"積木搭建術(shù)":建造者模式

移動(dòng)開發(fā) Android
掌握建造者模式的核心思想,就像獲得了一把萬能扳手,無論是處理傳統(tǒng)Java代碼還是擁抱現(xiàn)代Kotlin特性,都能讓你在Android開發(fā)的裝備庫(kù)中多一件趁手利器。

在 Android 開發(fā)的世界里,你是否遇到過這樣的場(chǎng)景:要?jiǎng)?chuàng)建一個(gè)需要十多個(gè)參數(shù)的復(fù)雜對(duì)象,結(jié)果代碼變成了一長(zhǎng)串讓人眼花繚亂的構(gòu)造函數(shù)?這時(shí)候,建造者模式就像一套精密的樂高積木工具包,能幫你優(yōu)雅地解決這個(gè)難題。

想象你要組裝一臺(tái)定制電腦

? 1.先選CPU

? 2.再加內(nèi)存條

? 3.挑顯卡

? 4.配硬盤

? ...

如果要求客戶一次性提供所有配件參數(shù),這體驗(yàn)得多糟糕?建造者模式正是通過分步配置的方式,讓對(duì)象構(gòu)建變得像搭積木一樣簡(jiǎn)單。

實(shí)戰(zhàn)三部曲:使用·解析·自定義建造者模式

官方組件實(shí)戰(zhàn)手冊(cè)

場(chǎng)景案例:對(duì)話框構(gòu)建藝術(shù)

// 分步構(gòu)建多功能對(duì)話框
AlertDialog dataDialog=new AlertDialog.Builder(this)
        .setTitle("數(shù)據(jù)采集")  
        .setView(R.layout.custom_data_form) 
        .setCancelable(false) 
        .setPositiveButton("提交", (d, w) -> {
            // 獲取表單數(shù)據(jù)
            EditText etName= dataDialog.findViewById(R.id.et_name);
            submitData(etName.getText().toString());
        })
        .setNegativeButton("清空", (d, w) -> {
            // 清空輸入框
            clearFormFields();
        })
        .setNeutralButton("說明", (d, w) -> {
            // 彈出幫助信息
            showHelpDialog();
        })
        .create(); // 最終組裝

dataDialog.getWindow().setSoftInputMode( 
    WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

這種鏈?zhǔn)秸{(diào)用的優(yōu)勢(shì)顯而易見:

? 每個(gè)設(shè)置項(xiàng)都像在積木盒里挑選零件

? 配置順序自由調(diào)整

? 省略不關(guān)心的配置項(xiàng)

? 代碼可讀性提升50%以上

源碼解析:拆解建造者引擎

AlertDialog.Builder核心實(shí)現(xiàn)揭秘,看看積木盒的機(jī)械結(jié)構(gòu):

public class AlertDialog extends Dialog {
    // 配置參數(shù)容器
    private AlertController mAlert;

    public static class Builder {
        // 存儲(chǔ)所有配置參數(shù)
        private final AlertController.AlertParams mParams;

        public Builder(Context context) {
            mParams = new AlertController.AlertParams(context);
        }

        public Builder setTitle(CharSequence title) {
            mParams.mTitle = title;
            returnthis;
        }

        public AlertDialog create() {
            final AlertDialog dialog =new AlertDialog(mParams.mContext);
            // 將配置參數(shù)應(yīng)用到對(duì)話框
            mParams.apply(dialog.mAlert);
            return dialog;
        }
    }
}

// 參數(shù)應(yīng)用關(guān)鍵邏輯
class AlertController {
    void apply(AlertParams params) {
        if (params.mTitle != null) {
            mTitleView.setText(params.mTitle);
        }
        // 其他參數(shù)應(yīng)用邏輯...
    }
}

設(shè)計(jì)亮點(diǎn)解析:

?參數(shù)容器模式:AlertParams集中管理所有配置項(xiàng)

?延遲加載機(jī)制:直到create()時(shí)才真正創(chuàng)建對(duì)話框

?職責(zé)分離:Builder負(fù)責(zé)收集參數(shù),Dialog負(fù)責(zé)展示邏輯

手把手打造自定義建造者

需求:創(chuàng)建可定制的圖片加載器

public class ImageLoaderBuilder {

    private Context context;
    private String url;
    private int placeholder= R.drawable.ic_loading;
    private int errorImage= R.drawable.ic_error;
    private boolean cacheInMemory = true;
    private ImageView targetView;

    public ImageLoaderBuilder(Context ctx) {
        this.context = ctx.getApplicationContext();
    }

    public ImageLoaderBuilder load(String imageUrl) {
        this.url = imageUrl;
        returnthis;
    }

    public ImageLoaderBuilder placeholder(int resId) {
        this.placeholder = resId;
        returnthis;
    }

    public ImageLoaderBuilder error(int resId) {
        this.errorImage = resId;
        returnthis;
    }

    public ImageLoaderBuilder disableMemoryCache() {
        this.cacheInMemory = false;
        returnthis;
    }

    public void into(ImageView imageView) {
        this.targetView = imageView;
        executeLoad();
    }

    private void executeLoad() {
        // 實(shí)際加載邏輯
        Glide.with(context)
            .load(url)
            .placeholder(placeholder)
            .error(errorImage)
            .skipMemoryCache(!cacheInMemory)
            .into(targetView);
    }
}

// 使用示例:構(gòu)建高級(jí)圖片加載
new ImageLoaderBuilder(getContext())
    .load("https://files.mdnice.com/user/31508/d33310a6-bb17-496b-ad44-da673a6bcce4.jpg")
    .placeholder(R.drawable.placeholder_gradient)
    .error(R.drawable.error_retry)
    .disableMemoryCache()
    .into(imageView);

避坑指南:建造者模式的正確打開方式

內(nèi)存管理:避免直接持有Activity Context,及時(shí)清理完成構(gòu)建的Builder實(shí)例,弱引用防止內(nèi)存泄漏

private WeakReference<ImageView> viewRef;

public void into(ImageView imageView) {
    this.viewRef = new WeakReference<>(imageView);
    executeLoad();
}

參數(shù)校驗(yàn):在executeLoad()前校驗(yàn)URL有效性

private void validateConfig() {
    if (TextUtils.isEmpty(url)) {
        throw new IllegalStateException("必須設(shè)置圖片URL");
    }
    if (targetView == null) {
        throw new IllegalStateException("必須指定目標(biāo)ImageView");
    }
}

靈活擴(kuò)展:支持不同圖片加載引擎

public ImageLoaderBuilder setEngine(LoadEngine engine) {
    this.engineType = engine;
    returnthis;
}

privatevoidexecuteLoad() {
    switch (engineType) {
        case GLIDE:
            loadWithGlide();
            break;
        case PICASSO:
            loadWithPicasso();
            break;
    }
}

最佳實(shí)踐建議:當(dāng)你的對(duì)象需要滿足以下任意兩個(gè)條件時(shí),就該考慮建造者模式了

? 參數(shù)數(shù)量超過5個(gè)

? 存在大量可選參數(shù)

? 需要支持多種配置組合

? 參數(shù)之間存在依賴關(guān)系

擴(kuò)展思考:現(xiàn)代開發(fā)中的新模式

隨著Kotlin的普及,DSL(領(lǐng)域特定語言)正在部分取代傳統(tǒng)建造者模式:

// 使用DSL風(fēng)格創(chuàng)建對(duì)話框
createDialog {
    title = "系統(tǒng)提示"
    message = "確認(rèn)清除緩存?"
    positiveButton("確定") {
        clearCache()
    }
    negativeButton("取消")
    cancelOnTouchOutside(false)
}

但傳統(tǒng)建造者模式依然在以下場(chǎng)景保持優(yōu)勢(shì):

? Java項(xiàng)目開發(fā)

? 需要嚴(yán)格參數(shù)校驗(yàn)的場(chǎng)合

? 與舊代碼庫(kù)的兼容需求

掌握建造者模式的核心思想,就像獲得了一把萬能扳手,無論是處理傳統(tǒng)Java代碼還是擁抱現(xiàn)代Kotlin特性,都能讓你在Android開發(fā)的裝備庫(kù)中多一件趁手利器。

責(zé)任編輯:武曉燕 來源: 沐雨花飛碟
相關(guān)推薦

2021-04-14 09:02:22

模式 設(shè)計(jì)建造者

2011-07-14 14:46:46

設(shè)計(jì)模式

2020-10-20 13:33:00

建造者模式

2021-10-26 00:21:19

設(shè)計(jì)模式建造者

2024-02-19 08:38:34

建造者模式Android設(shè)計(jì)模式

2021-01-21 05:34:14

設(shè)計(jì)模式建造者

2021-06-10 19:09:05

模式代碼建造者

2021-05-11 08:54:59

建造者模式設(shè)計(jì)

2021-07-28 10:02:54

建造者模式代碼

2022-11-01 15:25:01

構(gòu)建者模式Go 語言

2013-03-25 17:35:23

jimu傻瓜式App制作

2018-07-30 11:56:17

解密加密開發(fā)

2012-02-28 10:33:27

Eclipse 3.7Android環(huán)境

2022-10-09 08:48:13

配置化建造者參數(shù)

2010-11-04 09:57:38

In App PurcAndroid 2.3Android

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2012-04-11 09:26:13

內(nèi)核Linux 開發(fā)

2013-07-23 06:11:44

Android開發(fā)學(xué)習(xí)Android開發(fā)環(huán)境Java

2023-06-08 13:10:04

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)