2.Lsp。所谓任何地方假如你期待的是一个父类型Base,那么把它替换成任何的子类型Derived1, Derived2,程序都能正常工作。 还是关于需求者的。假如你做到了ask no more,比如说你只需要Base提供的功能,就不要在接口上要求Derived1, Derived2,如此,我们自然可以任意替换实际的实现。 假如你做到了ask no less,需要InputStreamReader就直接要求InputStreamReader而不是Reader,你就不会需要在代码中做downcast到InputStreamReader的动作。也就不会出现把Reader替换成StringReader之后出现的运行时错误。
3.单一职责原则。一个模块只应该做一件事。 仍然是需求者的设计方法。这里的“事”的概念应该是一个正交于其它“事”的功能。两个互相紧密耦合的“事”其实是一件事。 根据ask no more,假如一个模块做了两件正交的事,也就是把两个正交的模块耦合在一起,就意味着在我这个滥模块的某个地方有从一个模块到另一个模块的不正当的需求。你要求了你不应该要求的。
4。Ocp。开闭原则。软件,模块应该是可以不用改动代码而被扩展的。 其实,ocp与其说是一个原则,不如说是一个理想。它并没有指出具体的可操作方法,而只是给了一个目标。 一些人认为这就意味着类可以继续。这个看法太狭隘了。扩展一个模块固然可以用继续和override,但是,用接口组合一样可以做到。要害是,假如你的模块依靠抽象的接口而不是具体的类,那么别人就可以很轻易通过接口组合,adapter, decorator什么的通过给你传递不同的接口实现而达到扩展的目的。 这里面,仍然是一个简单的ask no more在起作用。
总而言之,所谓面向接口,对需求者来说,就是:用接口定义好自己需要的功能,no more, no less。而所谓“多态”,就是用来实现接口用的工具而已。 完了。