记录
| 日期 | 说明 |
|---|---|
| 2023/1/1 | 首次创建 |
| 2023/1/2 | 增加使用情况,android两块 |
| 2023/3/23 | 增加设计模式原则和代理模式 |
总纲
关于设计模式的一些概念
使用情况
- 用过:观察者、适配器、单例、工厂、装饰器、建造者、策略
- 了解:责任链、原型、代理
- 不熟:外观、桥接、组合、亨元、模板方法、迭代子、命令、备忘录、状态、访问者、中介者、解释器、并发型、线程池?
Android
- MVP:P控制View和Model,View和Model不能直接交互
- MVC:C控制View和Model,View和Model可以直接交互
- MVVM:VM控制View和Model。Model可以驱动VM来修改View
- 概念
- View:视图层,包含对应于activity、xml、View等。只做和Ui相关的工作,不涉及业务逻辑、操作数据、处理数据
- Model:数据层,包含数据实体和数据操作
- 持久化?
- ViewModel,关联层,将Model和View进行绑定,发生修改时负责刷新。只做和业务相关的工作。不涉及UI、控件引用
- LiveData:数据变化感知
- 赋值:setValue(必须在主线程),postValue(可以在任意线程)
- 可以通过observe观察数据变化
- 概念
//ViewModel.class
public MutableLiveData<String> account = new MutableLiveData<>();
//View.class
viewModel.account.observe(this, new Observer<String>() {
@Override
public void onChanged(String account) {
//TODO
}
})
-
- DataBinding;单向数据绑定和双向数据绑定
- 直接和xml中的数据进行绑定
- DataBinding;单向数据绑定和双向数据绑定
//xml
<layout>
<data>
<variable
name="userVM"
type="xxx.xxx.xxx.UserViewModel" />
</data>
<EditText
android:id="@+id/edit_account"
android:text="@={userVM.user.account}" />
<TextView
android:text="@{userVM.user.account}"/>
</layout>
//View
ActivityMainBinding dataBinding = DataBindingUtil.setContextView(activity, R.layout.activity_main);
UserViewModel userVM = new UserViewModel();
User user = new User();
userVM.getUser().postValue(user);
userVM.getUser().onserve(this, user2 ->
dataBinding.setUserVM(userVM));
dataBinding.button.setOnClickListener{v ->
//TODO
}
设计模式
原则
- 单一职责原则:专注降低类的复杂度,实现类要职责单一
- 复杂性降低
- 可读性提高
- 可维护性提高
- 变更引起的风险降低
- 依赖倒置原则:系统抽象化的具体实现,要求高层模块面向接口编程,是面向对象设计的主要实现机制之一
- 模块间的依赖通过抽象发生,实现类之间不直接发生依赖关系
- 接口或抽象类不依赖于实现类
- 实现类依赖接口或抽象类
- 接口隔离原则:要求类间的依赖关系建立在最小的接口上,对外暴露的接口尽可能少
- 开放关闭原则:所有面向对象原则的核心,设计要对扩展开发,对修改关闭
- 里式替换原则:实现开放关闭原则的重要方式之一,设计不要破坏继承关系
- 子类必须完成实现父类的方法
- 子类可以有自己的个性
- 覆盖或实现父类的方法时,输入参数可以被放大
- 覆盖或实现父类的方法时,输出结果可以被缩小
- 迪米特法则:降低系统的耦合度,减少对象之间的交互,使一个模块的修改尽量少的影响其他模块,扩展会相对容易 7,组合复用原则:在软件设计中,尽量使用组合/聚合而不是继承达到代码复用的目的
单例模式
- 保证一个类只有一个实例,关键是构造函数私有化,注意
getInstance方法需要同步锁以防止多线程造成多次实例化 - 优点:减少了内存的开销,避免了资源的多重占用
- 缺点:没有接口,不能继承,与单一职责原则冲突
- 双检验模型:重点理解volatile、synchronized、new
代理模式
- 概念:为其他对象提供一种代理以控制对这个对象的访问。
- 类型
- 静态代理:由开发创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。(代理类在程序编译前就已经存在)
- 动态代理:代理类在程序运行时运用反射机制动态创建而成。(代理类运行时动态生成)