设计模式和编码原则

编码六原则

引用自:http://c.biancheng.net/view/1324.html

开闭原则
  • Software entities should be open for extension,but closed for modification。
  • 软件实体应当对扩展开放,对修改关闭,这就是开闭原则的经典定义。当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
里氏替换原则
  • Inheritance should ensure that any property proved about supertype objects also holds for subtype objects。
  • 继承必须确保超类所拥有的性质在子类中仍然成立。
  • 里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
依赖倒置原则
  • High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions。
  • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。
单一职责原则
  • There should never be more than one reason for a class to change。
  • 单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。核心就是控制类的粒度大小、将对象解耦、提高其内聚性。
接口隔离原则
  • Clients should not be forced to depend on methods they do not use。The dependency of one class to another one should depend on the smallest possible interface。
  • 客户端不应该被迫依赖于它不使用的方法。一个类对另一个类的依赖应该建立在最小的接口上。要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
迪米特法则
  • Talk only to your immediate friends and not to strangers。
  • 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。
合成复用原则。组合/聚合复用原则
  • 它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。
  • 在成分对象可以看做是整体对象的一个属性时,优先采用组合方式。A has B,采用组合。 A is B 采用继承。

设计模式

单例模式
  • 构造函数 private
  • 静态内部类实现单例模式。懒汉模式(延迟加载),classloader类加载保证单例。
工厂模式
  • 一个工厂类,一个抽象接口,多个实现接口的产品子类。用工厂类创建产品子类的实例。
抽象工厂
  • 一个抽象工厂类,多个工厂子类,多个产品类。抽象工厂类组合了多个产品类的对象。抽象工厂模式可以使得多个产品类组合到一起工作。
  • 举例:抽象工厂类 PC笔记本抽象工厂。工厂子类 联想子工厂,戴尔子工厂。产品类 键盘产品,鼠标产品,电脑屏幕产品。抽象工厂包含创建鼠标的方法,创建键盘的方法,创建电脑屏幕产品的方法。
  • 参考链接
建造者模式
原型模式
  • java中主要是通过clone方法创建对象。
  • 使用场景:通过构造方法创建对象的代价很大。比如对象的创建需要读取数据库,或者需要从网络中加载读取数据,此时可以用clone的方式创建对象,降低创建对象的代价。
  • 要求:熟悉对象的浅拷贝和深拷贝。
结构型模式
  • 它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。
适配器模式
  • 适配器最好抽象一个接口出来。
  • Android 中的Adapter,ListAdapter,baseAdapter.
桥接模式
  • 一个抽象类(组合一个接口对象),多个抽象类的扩展子类,一个接口(用于抽象类中的组合对象),多个接口实现子类。
  • 桥接模式的组合关联关系建立在抽象层. 抽象类是对主类, 对外提供方法实现. 接口维度对外是不可见的.
  • 使用场景:当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。抽象层(抽象类和接口)中运用了组合,这是一种面向抽象化设计和编程的思想。抽象类组合了接口,实际也是可以抽象类组合另一个抽象类。
组合模式
  • 一个抽象类,很多抽象类的扩展子类,子类之间可能会有组合关系。
  • 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。运用了组合关系,是部分和整体的关系,满足 A has B 的关系。
  • 可以使用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
装饰器模式
  • 一个抽象功能类,多个功能类的具体实现,一个继承自抽象类的抽象装饰类,多个装饰类的具体实现。
  • 抽象装饰类实际还是一个功能类,因为继承了抽象功能类。
  • 装饰模式的目的仅仅是在原有的功能类的基础上扩展出一些新的功能。
  • 和桥接模式的区别:
    1.桥接模式对象自身有 沿着多个维度变化的趋势 , 本身不稳定;
    2.装饰者模式对象自身非常稳定, 只是为了增加新功能/增强原功能。
外观模式
  • 只需要一个新增的外观类。
  • 它向现有的系统添加一个统一的调用接口,来隐藏系统的复杂性,屏蔽系统内部模块中的相互作用,只为外部提供统一的功能调用,更加简化操作。
享元模式
  • 抽象享元基类,多个具体享元子类,非享元(外部状态),享元工厂(缓存享元实例)。
  • 主要用来实现对象的复用,减少对象的创建。避免出现大量对象的情况。存在两种状态,内部状态和外部状态。需要将一些不能共享的状态外部化,这将增加程序的复杂性。内部状态是享元通用的状态。
代理模式
  • 一个抽象接口,一个功能类,一个功能类的代理类。代理类组合功能类。功能类和功能类的代理均实现了抽象接口。调用者通过代理类调用实际功能类。
  • 代理分为静态代理和动态代理。动态代理的经典使用:Retrofit开源库。
  • 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
    2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
  • 应用场景:远程代理(服务器和客户端)、安全代理(安全控制)、虚拟代理、延迟加载、智能指引。
责任链模式
  • 一个抽象基类,多个功能实现子类。
  • 如果当前的职责类能够处理任务,任务就停止传递,否则任务向下一个职责类处理。
  • 每一个职责链上的节点都包含对下一个节点的引用。可以在构造函数初始化的时候赋值,也可以单独赋值。
命令模式
  • 命令执行器,命令对象,命令调用者。命令对象有一个统一的接口。
  • 命令调用者通过命令对象,操作命令执行器。实现命令调用者和命令执行器之间的松耦合。
  • 一般也会有一个命令队列,用于存储命令,以及支持撤销操作。
  • 实例:handler的msg就是类似于简化的命令模式。
迭代器模式
  • 一个抽象迭代接口iterator(hasNext()和 next()方法,注意可以加上泛型),迭代器实现类(一般是内部类),一个集合类,一个获取迭代器的接口iterable。
  • 可以参考ArrayList实现。集合类继承iterable,iterable用于获取一个迭代器实现。
  • 注意使用泛型,增强扩展性。
中介者模式
  • 抽象中介者,具体中介者,抽象子模块,多个具体子模块实现。
  • 如果模块很多,那么中介者承担的功能将很复杂,难以维护。如果中介者出现问题,那么将会严重影响整体功能。
  • 结合观察者模式和状态模式进行通信。
备忘录模式 Memento
  • 备忘录类,备忘录管理类。
  • 记录对象的内部状态,可以实现回滚的操作。可以结合原型模式,实现备忘录管理。
观察者模式
  • observable类,observer接口。 观察者管理类,观察者。
  • observable主要包含添加观察者(addObserver),删除观察者(deleteObserver),通知更新(notifyObservers)方法。observer包含update更新方法。
  • 参考BaseAdapter。
策略模式
  • 策略抽象类,具体策略方法。
  • 策略模式注重行为的不同。比如多种算法的实现,每种算法代表一个策略。策略模式可以根据不同的情况改变类或者方法的行为。
状态模式
  • 还没写!
模板方法模式
  • 一个抽象基类、多个具体实现子类
  • 抽象基类中定义了final 的模板方法,用于规定执行流程的顺序。子类继承了基类,可以实现流程的中某个或者某几个具体步骤,从而改变整体流程中的部分步骤,而不改变整体的流程骨架。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值