Android—设计模式原则及常见的设计模式

设计模式六大原则:

单一职责原则:实现类要职责单一,类之间不相互影响。

里氏替换原则:不要破坏继承体系,共享的父类方法应该保持不变,不能被子类重新定义。我们应该将父类定义为抽象类,并定义抽象方法。

依赖倒置原则:中心思想是面向接口编程。

接口隔离原则:在设计接口的时候要精简单一,类间的依赖关系应该建立在最小的接口上。

迪米特法则:要降低耦合。

开闭原则:总纲,其他五个设计原则都是开闭原则的具体形态,类、模块、方法等要对扩展开放,对修改关闭。 

优点:提高代码的复用性,可维护性。

设计模式:

创建型模式:                                                                                                                                                                                                     单例模式
                   建造者模式
                   工厂方法模式
                   原型模式
行为型模式
                   策略模式
                   状态模式
                   责任链模式
                   观察者模式
结构型模式
                   代理模式
                   装饰者模式
                   外观模式

1.建造者模式

把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

方便用户创建复杂的对象(不需要知道实现过程)代码。

体现了复用性、封装性

最明显的标志就是Build类,比如通知的构建

NotificationCompat.Builder(this,"channel1")
                .setContentTitle("测试通知1")
                .setContentText("通知1来了,通知1来了,通知1来了")
                .setSmallIcon(R.drawable.touxiang)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.b))
                .build()

2.单例模式

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

Glide.with(this).load(bitmap).override(250,250).into(main_imagV)

实现方式有:懒汉式、饿汉式、静态内部类、双重锁检查、枚举等方式

单例模式的实现方式

3.原型模式

原型模式就是你想更快的获取到一个相同属性的对象,那么就可以使用原型模式。

在开源框架中可以看到,比如OkHttpClient中就存在着下面的方法。

/** Returns a shallow copy of this OkHttpClient. */
  @Override public OkHttpClient clone() {
    return new OkHttpClient(this);
  }

因为OkHttpClient的构造过程比较复杂,参数众多,所以用这种方式来直接生成新对象,成本很低,而且能保留之前对象的参数设置。

4.工厂方法模式

定义:通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

作用:将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。

步骤1: 创建抽象工厂类,定义具体工厂的公共接口; 
步骤2: 创建抽象产品类 ,定义具体产品的公共接口; 
步骤3: 创建具体产品类(继承抽象产品类) & 定义生产的具体产品; 
步骤4: 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法; 
步骤5: 外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

工厂模式是创建型模式 ,它关注对象创建,提供创建对象的接口,让对象的创建与具体的使用客户无关。

静态工厂方法在Android中比较明显的例子应该就是BitmapFactory了,通过各种decodeXXX()就可以从不同渠道获得Bitmap对象。

            val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))

decodeStream主要处理来于网络的图片,decodeFile来于sd开内的图片,decodeResource来于资源文件里的图片

5.策略模式

表示的是在遇到一种问题有多种解法的时候,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。

策略模式把对象本身和运算规则区分开来,因此整个模式也分为三个部分。

环境类(Context):用来操作策略的上下文环境,也就是我们游客。

抽象策略类(Strategy):策略的抽象,出行方式的抽象

具体策略类(ConcreteStrategy):具体的策略实现,每一种出行方式的具体实现。

策略模式是对象行为型模式 ,它关注行为和算法的封装 。

6.责任链模式

避免请求的发送者和接收者之间的耦合关系。

将整个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

好处就是请求者不用知道到底是哪个对象处理的,反正提交请求就对了。

7.观察者模式

Android中的观察者模式应该是用的非常频繁的一种模式了

某个对象发生变化时,立刻收到通知。

Android里面的各种监听器,也都属于观察者模式,比如触摸、点击、按键等,ContentProvider和广播接收者也有观察者模式的身影,还有liveData。

liveData.observe(LifecycleOwner,Observer{....})

8.模板方法模式

由抽象固定流程步骤,具体步骤交给子类进行具体实现。

AsyncTask,各个方法之间的执行符合流程,具体实现由我们完成。

9.代理模式

为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。

kotlin中的类委托和委托属性

类委托:将一个类的具体实现委托给另一个类去完成

class MySet<T>(val helperSet:HashSet<T>):Set<T> by helperSet{
    .......
}

MySet类继承自Set本应该重写其所有方法,by关键字委托helperSet(既HashSet<T>)去完成,所以可以只重写自己需要的方法,或者添加其他方法。

委托属性可参考by lazy,懒加载技术

10.装饰器模式

通常的做法是将原始对象作为一个参数传给装饰者的构造器

装饰器模式和代理模式非常相似,装饰器模式关注于在一个对象上动态的添加方法,而代理模式关注于控制对对象的访问。

11.外观模式

提供一个统一的接口,用来访问子系统中的一群接口,这样能够降低用户的使用成本,也能够对用户屏蔽很多实现细节。外观模式也是我们封装API的常用手段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章