设计模式

5,659 阅读3分钟

记录

日期说明
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中的数据进行绑定
//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
}

设计模式

原则

  1. 单一职责原则:专注降低类的复杂度,实现类要职责单一
  • 复杂性降低
  • 可读性提高
  • 可维护性提高
  • 变更引起的风险降低
  1. 依赖倒置原则:系统抽象化的具体实现,要求高层模块面向接口编程,是面向对象设计的主要实现机制之一
  • 模块间的依赖通过抽象发生,实现类之间不直接发生依赖关系
  • 接口或抽象类不依赖于实现类
  • 实现类依赖接口或抽象类
  1. 接口隔离原则:要求类间的依赖关系建立在最小的接口上,对外暴露的接口尽可能少
  2. 开放关闭原则:所有面向对象原则的核心,设计要对扩展开发,对修改关闭
  3. 里式替换原则:实现开放关闭原则的重要方式之一,设计不要破坏继承关系
  • 子类必须完成实现父类的方法
  • 子类可以有自己的个性
  • 覆盖或实现父类的方法时,输入参数可以被放大
  • 覆盖或实现父类的方法时,输出结果可以被缩小
  1. 迪米特法则:降低系统的耦合度,减少对象之间的交互,使一个模块的修改尽量少的影响其他模块,扩展会相对容易 7,组合复用原则:在软件设计中,尽量使用组合/聚合而不是继承达到代码复用的目的

单例模式

  • 保证一个类只有一个实例,关键是构造函数私有化,注意getInstance方法需要同步锁以防止多线程造成多次实例化
  • 优点:减少了内存的开销,避免了资源的多重占用
  • 缺点:没有接口,不能继承,与单一职责原则冲突
  • 双检验模型:重点理解volatile、synchronized、new

代理模式

  1. 概念:为其他对象提供一种代理以控制对这个对象的访问。
  2. 类型
  • 静态代理:由开发创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。(代理类在程序编译前就已经存在)
  • 动态代理:代理类在程序运行时运用反射机制动态创建而成。(代理类运行时动态生成)