六大设计原则是设计模式的理论,设计模式是设计原则的实践。
一个类只负责一个职责,术语叫仅有一个引起变化的原因。一个类应该是一组相关性很高的函数及数据的封装。
一个软件实体应该对扩展开放,对修改关闭。
提倡一个类一旦开发完成,后序增加新的功能,不应该通过修改这个类实现,而是通过继承或者接口实现增加新的类。
抽象不应该依赖于细节,细节应该依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
也就是说两个模块之间的通信应该通过接口来实现。
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。即让调用者依赖的接口尽可能小,接口分离类似于单一职责原则。
一个软件实体应该尽可能地减少与其他实体发生相互作用。或者说一个类,对自己需要调用的类知道得最少,类的内部应该与被调用者无关,也称迪米特隔离
。
例如使用一个Thread类下边的run方法,按照迪米特原则,可以把run单独抽离出来,构建一个Runnable接口供userClass使用,这样调用者userClass与Thread之间的交互是最少的。
所有引用基类(父类)的地方,必须能够透明的使用其子类的对象。即一个软件系统中,把所有用到某个类的地方都替换为其子类,系统应该仍然可以正常工作。这个原则依赖面向对象的继承特性和多态特性。
单一职责原则
构建一个类或者接口开闭原则
继承类或者实现接口,来构建新类。里式替换
原则,所有使用父类的地方可以使用子类来替换。依赖倒置
原则,使用接口通信。接口隔离
原则,应该设计多个专门实现某种功能的接口迪米特原则
,老师类要实现对同学的点名,应该通过一个用来跟同学交互的班长,分层次实现。角色说明:
数据的获取以及对数据进行的不依赖视图的操作
Activity
除了承担View层
的部分职责(加载应用布局,监听并反馈用户操作),还要承担Controller层
的功能(业务逻辑处理)。为了解决MVC模式存在的问题,分离Activity
中的View
层和Controller
层的职责,从而对Activity
代码量进行优化和瘦身。
角色说明:
相对于MVC,MVP模式把原来的UI逻辑抽象为View接口,把原来的业务逻辑抽象为Presenter接口,Model还是原来的Model
对比MVC模式,它的优点在于:
为了更加分离M、V层,更加释放Activity的压力,于是出现了MVVM(其中最后的VM表示viewmodel)
● M(Model,模型层 )
● V(View,视图层)
● VM(ViewModel,V与M连接的桥梁,也可以看作为控制器)
MVVM基本与MVP模式完全一致,只是将表示层Presenter改名为ViewModel。
模式说明:
MVVM比较特别的地方在于采用了双向绑定(data binding):view的变动,自动反映在ViewModel,反之亦然。
核心思想是原来UI逻辑抽象为View接口
,把原来的业务逻辑抽离为Presenter接口
,并且由具体的实现类来完成。具体实现思路如下:
MVP模式的UML图如下:
通过UML图可以看出使用MVP模式的步骤如下:
activity里只保留对Ipresenter接口的调用,其他工作全部留到PresenterCompl实现类中实现。
饿汉单例:初始化时直接创建一个静态的实例对象,这种方式天生就是线程安全的。
懒汉单例:实际需要使用时才创建,需要利用线程同步机制,有下边三种写法:
class SingleInstance {
private SingleInstance() {
}
private static SingleInstance singleInstance;
public static SingleInstance getInstance() {
if (singleInstance == null) {
synchronized (SingleInstance.class) {
if (singleInstance == null) {
singleInstance = new SingleInstance();
}
}
}
return singleInstance;
}
}
class Single {
private Single(){
}
private static Single single;
public static synchronized Single GetInstance() {
if (single == null) {
single = new Single();
}
return single;
}
}
静态内部类的成员只在初次调用时被初始化,非常符合懒汉单例的方式。
class SingleByInner{
private SingleByInner() {
}
static class Inner {
private static final SingleByInner INSTANCE = new SingleByInner();
}
public static SingleByInner getInstance() {
return Inner.INSTANCE;
}
}
class SingleByInner{
private SingleByInner() {
}
static class Inner {
private static final SingleByInner INSTANCE = new SingleByInner();
}
public static SingleByInner getInstance() {
return Inner.INSTANCE;
}
}
定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到了子类
封装一个对象的构造过程,并允许按步骤构造
监听者用来监听自已感兴趣的事件,当收到自已感兴趣的事件时执行自定义的操作。
监听者模式在Android中有大量的运用,相信大家都不会感到陌生。在Android开发中,Button控件的点击事件就是监听者模式最常见的例子。
当Button被点击,执行了 OnClickListener.onClick。 Activity中给这个Button设置了自己实现的OnClickListener,并复写了onClick方法,就能执行自定义操作了。
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地互相作用, 从而达到松耦合的目的。
由以下几个部分组成
每个同事角色都知道中介者角色,但不与其他同事进行交互,而是通过中介者来调度。
为其他对象提供一种代理以控制对这个对象的访问。也叫委托模式。
主要有三个角色:
优点:
责任链模式是一种行为型设计模式,它用于将多个请求处理器对象连接成一条链,可以让请求沿着这条链不断地传递,直到有一个请求处理器处理完成为止,实现高效灵活的请求处理与分发。
主要涉及三个角色:
优点:
缺点:
将一个类的接口变换成客户端锁期待的另一种接口,从而使原本因接口不匹配而无法工作在一起的两个类能够在一起工作。
优点: