《Android 源码设计模式解析与实战》笔记
设计模式
面向对象的六大原则
- 单一责任原则(Single Responsibility Principle 缩写SRP)
将独立的任务抽象成类 - 开闭原则(Open Close Principle 缩写OCP)
对类,方法,模块扩展是开发的,但对类修改是封闭的 - 里式替换原则(Liskov Substitution Principle 缩写LSP)
所有引用基类的地方必须能够透明的替换成子类对象,不会引起异常。核心就是抽象.Android View 的设计 依赖倒置原则 (Dependence Inversion Principle 缩写DIP)
指代了一种特定的解耦形式,使得高层次的模块不依赖于底层次的模块的实现细节的目的,依赖模块被颠倒了。
几个关键点:1) 高层模块不应该依赖底层模块,两者都应该依赖其抽象;
2)抽象不应该依赖细节;
3)细节应该依赖抽象;
抽象就是接口和抽象类,细节就是实现类。高层模块就是调用端,低模块就是具体实现类。改原则表现是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。面向抽象编程.接口隔离原则(InterfaceSegregation Principles 缩写ISP)
定义:客户端不应该依赖它不需要的接口 或者说类间的依赖关系应该建立在最小接口上。这样不是很明白我们看代码public void put(String url,Bitmap bmp){ FileOutputStream fileOuputStream = null; try{ fileOutputStream = new FileOutputStream(cacheDir+url); bmp.compress(CompressFormat.PNG,100,fileOutputStream); }catch(FileNotFoundException e){ e.printStackTrace(); }finanly{ if(fileOutputSteam != null){ try{ fileOutputStream.close(); }catch(IOException e){ e.printStackTrace(); } } } }
这种代码应该是比较臃肿了。对于close我们知道Java中是Closeable接口来的 只有一个close.FileOutputStream实现了这个接口,并且Java中有100 个类实现了这个接口。哪每个都要这样写估计疯了,好我们可以这样实现一个工具类.
public final class CloseUtils{ private CloseUtils(){} public static void closeQuietly(Closeable closeable){ if(null != closeable){ try{ closeable.close(); }catch(IOException e){ e.printStackTrace(); } } } }
那上面那段代码就改成这个样子了
public void put(String url,Bitmap bmp){ FileOutputStream fileOuputStream = null; try{ fileOutputStream = new FileOutputStream(cacheDir+url); bmp.compress(CompressFormat.PNG,100,fileOutputStream); }catch(FileNotFoundException e){ e.printStackTrace(); }finanly{ CloseUtils.closeQuietly(fileOutputStream); } }
CloseUtils 的closeQuietly 方法的基本原理就是依赖于Closeable 抽象而不是具体实现(依赖倒置原则),并且建立在最小依赖原则的基础上,它只需要知道这个对象是可关闭,其他的一概不关心,也就是这里的接口隔离原则.
单一职责、开闭原则、里氏替换、接口隔离以及依赖倒置 5个原则定义为SOLID原则- 迪米特原则(Law of Demeter 缩写LOD 也称为最少知识原则Least Knowledge Principle)
一个类应该对其他对象有最少的了解。通俗讲,一个类应该对自己需要耦合或调用的类知道得最少,类的内部如何实现与调用者或者依赖者没关系,调用者或者依赖者只需知道它需要的方法即可,其他的可一概不用管。