对于写好代码,以前一直觉得,一个程序员如果写了超过10万行的代码,多读一些源码,自然就能写好代码。而且作为移动端的开发需要学的东西太多,像 Linux 操作系统,音视频,相机,图片,特效,OpenGL,3D 建模,NDK/JNI 等知识虽然作为移动端开发不需要特别精通,但是也得都会才行,至少得能配合这些专业的开发团队进行技术沟通,对各种手机进行调试,因为这些都是手机开发的一部分,他们的优先级都要高于设计模式这一块。但是最近一段时间和团队的配合发现,理解和掌握典型的设计模式,有利于团队提高沟通,设计的效率和质量,所以为了能够更直观的使用设计模式,今天简单归纳总结一下设计模式。要学会设计模式就得先明白面向对象的设计基础,封装,继承,多态,接口和抽象类。
第一,面向对象设计
封装的目的是隐藏事物内部的实现细节,以便提高安全性和简化编程。我们在日常开发中,有很多因为无意间暴露了细节导致的难缠 bug,比如在多线程环境暴露内部状态,导致的并发修改问题。这时候使用封装不仅可以提供合理的边界,避免外部调用者接触到内部细节,而且还能简化调用界面,避免太多无意义的细节。
继承是代码复用的基础机制,也可以看作是非常紧耦合的一种关系,父类代码修改,子类行动也会变动。在实践中,如果过度使用继承,也可能会起到反效果。
多态,我们马上想到的就是重写,重载,向上转型,重写是父子类中相同名字,参数的方法,不同的实现;重载是相同名字,不同参数,本质上是方法签名的不同。
接口是对行为的抽象,它是抽象方法的集合,利用 API 定义和实现分离的目的。接口中要么是抽象方法,要么是静态方法。
抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码的重用。抽象类大多用于抽取相关 Java 类的共用方法或者共同成员变量,然后通过继承的方式达到代码复用的目的。
Java 相比于其他面向对象语言,如 C++,设计上有一些区别,比如 Java 不支持多继承。这种限制,在规范了代码实现的同时,也产生了一些局限性,影响着程序设计结构。Java 类可以实现多个接口,因为接口是抽象方法的集合,所以这是声明性的,但不能通过多个抽象类来重用逻辑。在一些情况下存在特定场景,需要抽象出与具体实现,实例化无关的通用逻辑,或者纯调用关系的逻辑,但是使用传统的抽象类会陷入到单继承的窘境。常见的做法是,实现由静态方法组成的工具类。接口的职责也不仅仅限于抽象方法的集合,其实有各种不同的实践。比如我们熟知的 Serializable 接口就是为了声明某些东西。
第二,面向对象编程设计原则
既然是设计,那一定有原则可以遵循,我们先把代码设计最基本的五个原则搞明白。
1,单一职责,类或者对象最好是只有单一职责,在程序设计中如果发现某个类承担着多种义务,可以考虑进行拆分。
2,开关原则,设计要对扩展开放,对修改关闭。程序设计应保证平滑的扩展性,尽量避免因为新增同类功能而修改已有实现,这样可以减少回归问题。
3,里式替换,就是进行继承关系抽象时,凡是可以用父类或者基类的地方,都可以用子类替换。
4,接口分离,我们在进行类和接口设计时,如果在一个接口里定义了太多方法,其子类都可能面临两难,就是只有部分方法对它是有意义的,这就破坏了程序的内聚性。对于这种情况,可以通过拆分成功能单一的多个接口,将行为进行解耦。在未来的维护中,如果某个接口设计又变,不会对使用其他接口的子类构成影响。
5,依赖反转,实体应该依赖抽象而不是实现。也就是说高层次模块,不应该依赖低层次模块,而是应该基于抽象。实践这一原则是保证产品代码之间适合耦合度的法宝。
举例:开关原则,看下图:

第二,设计模式
有了面向对象设计基础,我们再来看设计模式。设计模式是人们为软件开发中相同表征的问题,抽象出的可重复利用的解决方案。在某种程度上,设计模式已经代表了一些特定情况的最佳实践,同时也起到了软件工程师之间沟通的行话的作用。学习一个新知识,我的习惯是先抽象分类,我们先把现在常见的设计模式按应用目标进行一下分类,大致可以分为创建性模式,结构性模式和行为型模式。
创建型模式,是对对象创建过程中的各种问题和解决方案的总结。包括有工厂模式,单例模式,构建器模式,原型模式。
结构性模式,是针对软件设计结构的总结,关注于类,对象继承,组合方式的实践经验。包括有桥接模式,适配器模式,装饰者模式,代理模式,组合模式,外观模式,享元模式。
行为型模式,是从类或对象之间交互,职责划分等角度总结的模式。包括有策略模式,解释器模式,命令模式,观察者模式,迭代器模式,模板方法模式,访问者模式等。
上面说了那么多模式,都是前辈们总结的,我们给这些模式抽象分类主要就是方便使用,我们今天分析一个我们最常见的模式,单例模式。既然要学习单例模式,首先我们先看看权威是怎么实现的,比如在 Java 核心类库中的 java.lang.Runtime 中的单例模式实现,看下图:

看 java 核心类库中的单例模式,它并没有使用复杂的双检锁实现,也没有使用枚举类型实现。需要注意的是它在最新的版本中静态实例被声明为 final 。所以我建议在 android 中使用单例模式要学习 Java 类库的写法。因为毕竟手机使用的是简单命令集架构,服务器使用的是复杂命令集架构,同样的配置服务器的速度是手机的十倍。手机开发还是要尽量的减少资源的消耗。
网友评论