聊聊Android的架构UDD 界面层 数据层 网域层

聊聊现在的Android架构,界面层 数据层 网域层,姑且称为UDD

在现代 Android 开发中,通常会将应用架构分为界面层、数据层和网域层,每个层次都有其特定的职责和功能。

一、界面层(UI Layer)

  1. 职责:

    • 负责与用户进行交互,展示数据和接收用户输入。
    • 实现用户界面的布局、样式和交互逻辑。
    • 将用户操作转化为业务逻辑请求,并将数据层返回的结果展示给用户。
  2. 技术和组件:

    • Jetpack Compose:用于构建声明式用户界面,提供了简洁高效的界面开发方式。
    • ViewModel:用于管理界面相关的数据和逻辑,在配置更改(如屏幕旋转)时保存状态。
    • LiveData:用于在界面层和数据层之间传递数据变化通知,实现数据的自动更新。
  3. 设计原则:

    • 单一职责原则:每个界面组件只负责一个特定的功能,提高可维护性和可测试性。
    • 分离关注点:将界面逻辑与业务逻辑和数据访问分离,使得代码更加清晰和易于理解。
    • 响应式设计:使用响应式编程技术,如 LiveData 和 Flow,实现界面的自动更新,提高用户体验。

二、数据层(Data Layer)

  1. 职责:

    • 负责数据的存储、检索和管理。
    • 提供数据访问接口,供界面层和网域层使用。
    • 处理数据的缓存、同步和持久化。
  2. 技术和组件:

    • Room:用于本地数据库的管理,提供了对象关系映射(ORM)功能,方便数据的存储和检索。
    • Retrofit:用于网络请求,与服务器进行数据交互。
    • Repository 模式:用于封装数据访问逻辑,提供统一的数据访问接口,隔离界面层和数据存储的具体实现。
  3. 设计原则:

    • 数据抽象:将数据的存储和访问细节封装在数据层内部,对外提供抽象的数据访问接口,提高代码的可维护性和可扩展性。
    • 数据缓存:使用缓存技术,如内存缓存和本地数据库缓存,提高数据的访问速度和减少网络请求。
    • 数据同步:处理数据的同步问题,确保本地数据与服务器数据的一致性。

三、网域层(Domain Layer)

  1. 职责:

    • 包含应用的业务逻辑和领域模型。
    • 处理业务规则、数据验证和业务流程。
    • 与数据层和界面层进行交互,协调数据的获取和处理。
  2. 技术和组件:

    • 领域模型:定义应用的业务实体和业务规则,如用户、订单、产品等。
    • Use Case:用于封装具体的业务逻辑,如登录、注册、下单等。
    • 业务逻辑组件:如验证器、计算器、规则引擎等,用于处理具体的业务逻辑。
  3. 设计原则:

    • 业务逻辑封装:将业务逻辑封装在网域层内部,与界面层和数据层分离,提高代码的可维护性和可测试性。
    • 单一职责原则:每个 Use Case 只负责一个特定的业务逻辑,提高代码的可读性和可维护性。
    • 领域驱动设计:采用领域驱动设计(DDD)的方法,将业务领域的概念和规则反映在代码结构中,提高代码的可理解性和可扩展性。

通过将 Android 应用架构分为界面层、数据层和网域层,可以实现代码的分离和解耦,提高代码的可维护性、可测试性和可扩展性。每个层次都有其特定的职责和功能,通过清晰的接口进行交互,使得应用的开发更加高效和可靠。

以下是一个简单的 Android 应用架构示例,包含界面层、数据层和网域层:

1. 界面层(Presentation Layer)

创建一个使用 Jetpack Compose 的界面:

复制代码
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapp.ui.theme.MyAppTheme

@Composable
fun MyScreen() {
    MyAppTheme {
        val viewModel = viewModel<MyViewModel>()
        val data by viewModel.data.observeAsState()

        if (data!= null) {
            Text(text = "Data: ${data!!.name}")
        } else {
            Text(text = "Loading...")
        }
    }
}

2. 数据层(Data Layer)

定义数据访问接口和实现:

复制代码
class DataRepository {
    fun getData(): DataModel? {
        // 模拟从数据库或网络获取数据
        return DataModel("Sample Data")
    }
}

3. 网域层(Domain Layer)

定义领域模型和业务逻辑:

复制代码
data class DataModel(val name: String)

4. ViewModel

连接界面层和数据层:

复制代码
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow

class MyViewModel : ViewModel() {
    private val _data = MutableStateFlow<DataModel?>(null)
    val data: StateFlow<DataModel?> = _data.asStateFlow()

    init {
        loadData()
    }

    private fun loadData() {
        val repository = DataRepository()
        _data.value = repository.getData()
    }
}

5. 主题设置

复制代码
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color
import com.google.accompanist.systemuicontroller.rememberSystemUiController

@Composable
fun MyAppTheme(
    darkTheme: Boolean = false,
    // Dynamic color is available on Android 12+
    dynamicColor: Boolean = false,
    content: @Composable () -> Unit
) {
    val systemUiController = rememberSystemUiController()
    val useDarkIcons =!dynamicColor && darkTheme

    SideEffect {
        systemUiController.setSystemBarsColor(
            color = Color.Transparent,
            darkIcons = useDarkIcons
        )
    }

    content()
}

MainActivity 中显示这个界面:

复制代码
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.example.myapp.MyScreen

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyScreen()
        }
    }
}

这个示例展示了一个简单的架构,其中界面层使用 Jetpack Compose 展示数据,数据层模拟获取数据,网域层定义了数据模型。你可以根据实际需求进一步扩展和优化这个架构。

相关推荐
舒一笑4 小时前
用几十行代码搞定 Chat 接口透明转发:跨环境轻量级网关实战
后端·程序员·架构
狼爷5 小时前
短视频播放量(Views)计数系统实现方案:高并发、不丢数的工业级实践
后端·架构
私人珍藏库7 小时前
【Android】聆听岛[特殊字符]聚合全网音乐[特殊字符]免费听歌下载神器[特殊字符] 聚合音乐平台|无损母带下载|歌词封面同步|免费无广告听歌工具
android·人工智能·工具·软件·多功能
YF02118 小时前
Android触摸机制与自定义 View 实战
android·app
Dabei8 小时前
Android TV 焦点处理详解:遥控器与空鼠
android·前端
悠哉清闲9 小时前
裁剪SurfaceView
android
常利兵9 小时前
Android字体字重设置全攻略:XML黑科技+Kotlin动态实现,告别.ttf臃肿
android·xml·科技
therese_1008610 小时前
安卓-IPC
android
Dabei10 小时前
Android 副屏(Virtual Display)创建与悬浮窗画中画显示实战
前端·架构
程序员老邢10 小时前
【产品底稿 12】工程架构最终定型:完整模块拆分、分包规范、层级依赖与开发规约全清单
微服务·架构·springboot·多模块·技术债务