从开-闭原则中能够看出来面向对象的重要原则是建立抽象化,并从抽象化导出具体化。具 体化能够给出不一样的版本,每一版本都给出不一样的实现。里氏代换原则从另外一个侧面描述 抽象化和具体化,里氏代换原则代表:一个软件若是使用的是一个基类的话,那么必定适 用于其子类,并且它根本不可能察觉出基类对象和子类对象的区别;必须指出,这个原则 反过来不必定成立,即一个软件实体使用的是一个子类的话,那么它不必定适用于基类。html
策略模式讲的是:若是有一组算法,那么就将每个算法封装起来,使它们能够互换。 封装的概念不难理解,而使算法能够互换大,则须要将具体策略角色放到一个类型等级 结构中,使它们拥有共同的接口,这种互换性依赖的是里氏代换原则。从策略模式uml中 能够看出,客户端依赖于基类类型,而真实类型是具体的策略类(子类),这是具体策略 角色能够即插即用的关键。算法
策略模式设计模式
合成模式经过使用树结构描述总体与部分的关系,从而能够将叶子元素和复合元素同等 看待,因为叶子元素和复合元素都是抽象角色的子类,所以二者均可以替代抽象角色出 现的任何地方,显然,里氏代换原则是合成模式可以成立的基础。post
合成模式优化
代理模式给某一对象提供一个代理对象(Proxy),并由代理对象控制原对象 (RealSubject)的引用,代理模式可以成立的关键,在于代理对象和原对象都是抽象角色 (Subject)的子类,客户端只知道抽象角色,而代理对象能够代替抽象角色出如今任何地 方,而将原对象隐藏在幕后。spa
代理模式设计
只要有可能,不要从具体类继承,如图,给出了一个继承造成的等级结构例子,能够看 出,全部子类都是从接口或抽象类继承,具体类没有子类。换言之,在一个继承关系形 成的等级结构里,树叶节点均应是具体类,而树枝节点均应是接口或抽象类。代理
不从具体类继承code
抽象化(包括接口和抽象类)一般表明一个抽象概念,它提供一个继承的出发点,而具体类 则不一样,具体类能够实例化,应当给出一个有商业逻辑实现的对象模板,不该当作为超类。 子类应当扩展超类的责任,而不是置换或撤消超类的责任。若是有两个具体类有继承关 系,一般子类须要将继承自超类的责任取消或置换后才能使用,极可能这个子类根本就不 是那个超类的子类,这样的设计能够优化。orm
将狗设计成猫的子类,如图所示,猫有上树的能力,狗没有,为了继承关系成立,只好将 猫上树的能力取消掉,这个关系显然是错误的。正确的继承关系是引入一个抽象类,在这 里就是动物类,两个具体类设计成抽象类的子类。
正确继承
Date: 2014-07-19 17:08:07
HTML generated by org-mode 6.21b in emacs 23