1、综述
设计模式,根据前人经验总结出常见软件工程问题的解决思想套路。GoF一共概括了23种设计模式,固然还有人扩充,不止这些。
设计模式主要利用面向对象语言的特性,而android 的设计主要用JAVA语言,有不少地方用到设计模式。android
2、设计原则
设计模式是遵循面向对象设计的五个设计原则来设计的,以下:
1.单一职责原则(SRP)--一个类只能有一个职责,多个职责耦合在一块儿,会影响复用性。
2.开放封闭原则(OCP)--对扩展是开放的,而对修改是封闭的
3.Liskov替换原则(LSP)--继承必须确保超类所拥有的性质在子类中仍然成立
4.依赖倒置原则(DIP)--高层次的模块不该该依赖于低层次的模块,他们都应该依赖于抽象;抽象不该该依赖于具体,具体应该依赖于抽象。
5.接口隔离原则(ISP)--使用多个专门的接口比使用单一的总接口要好。算法
3、常见设计模式
一、单例模式
最简单的设计模式,避免在内存中频繁的实例化因此将它的对象写成static 静态 这样它的对象就只有一份存在静态内存区使用的时候只需要经过
getInstance()就能够直接拿到这个静态对象。经常使用到的好比数据库管理类DatabaseHelper和输入法管理类InputMethodManager。数据库
1 //饿汉式 2 class Singleton { 3 private static Singleton instance=new Singleton(); 4 private Singleton(){} 5 static Singleton getInstance() { 6 return instance; 7 } 8 } 9 10 //懒汉式 11 class Singleton { 12 private static Singleton instance=null; 13 private Singleton(){} 14 static Singleton getInstance() { 15 if(instance==null) 16 instance=new Singleton(); 17 return instance; 18 } 19 }
饿汉式是线程安全的,懒汉式是线程不安全的,若是要考虑线程,能够同步代码块也能够同步方法,同步代码块是最好的方法canvas
二、模板方法设计模式
经过把不变的的行为搬移到超类,去除子类中重复的代码来体现它的优点;当不变的和可变的行为在子类实现中混合在一块儿的时候,
不变的行为就会在子类中重复实现,咱们经过模板方法模式把这些行为搬移到单一的地方,这样就能够帮助子类摆脱重复不变行为的纠缠。经常使用到的好比View的Draw方法。安全
若是咱们自定义View的话,咱们通常也是重写onDraw方法便可。ide
1 public class View{ 2 /** 3 * 钩子操做,空实现 4 */ 5 protected void onDraw(Canvas canvas) { 6 } 7 8 /** 9 *钩子操做,空实现 10 */ 11 protected void dispatchDraw(Canvas canvas) { 12 } 13 14 //算法骨架 15 public void draw(Canvas canvas) { 16 if (!verticalEdges && !horizontalEdges) { 17 // 步骤1 18 if (!dirtyOpaque) onDraw(canvas); 19 20 // 步骤2 21 dispatchDraw(canvas); 22 23 // 步骤3 24 onDrawScrollBars(canvas); 25 26 return; 27 } 28 } 29 //... ... 30 } 31 32 public class TextView{ 33 @Override 34 protected void onDraw(Canvas canvas) { 35 //大量自定义实现代码 36 } 37 }
三、建造者模式
将一个复杂对象的构造与它的表示分离,使一样的构建过程能够建立不一样的表示,这样的设计模式被称为建造者模式。
上文讲到Dialog主要用到建造者模式。AlertDialog.Builder就是具体建造者,另外,它是以匿名类的方式被建立的,并且,
Builder类是AlertDialog的内部类,这样,耦合性比较低,这正是面向对象中要达到的设计意图之一。 最后调用show函数,
它的返回类型正是咱们要建立的产品,即AlertDialog。 因此,Builder(具体建造者)是AlertDialog(产品)的内部匿名类,用来建立并显示一个dialog。函数
四、适配器模式
把一个类的接口变换成客户端所期待的另外一种接口,从而使本来不匹配而没法在一块儿工做的两个,类可以在一块儿工做。
适配器模式分为类适配器模式和对象适配器模式。ListView用于显示列表数据,可是做为列表数据集合有不少形式,
有Array,有Cursor,咱们须要对应的适配器做为桥梁,处理相应的数据(并能造成ListView所须要的视图)ui
五、观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都获得通知并被自动更新。
在ListView中Adapter中favoritesAdapter.registerDataSetObserver(mDataSetObserver);;数据改变以后会自动调用。spa
六、and so on