连载:面向对象葵花宝典:思想、技巧与实践(33) - ISP原则

来源:互联网 发布:centos设置中文输入法 编辑:程序博客网 时间:2024/06/07 04:02

 ISP,Interface Segregation Principle,中文翻译为“接口隔离原则


和DIP原则一样,ISP原则也是大名鼎鼎的Martin大师提出来的,他在1996年的C++ Reporter发表“ The Interface Segregation Principle”的文章详细阐述了ISP原则,并且在他的经典著作《 Agile Software Development, Principles, Patterns》(中文翻译为:敏捷软件开发:原则、模式与实践)、《Practices, and Agile Principles, Patterns, and Practices in C#》(中文翻译为:敏捷软件开发:原则、模式与实践(C#版))中详细解释了ISP原则。

 

ISP最原始的定义如下:

“CLIENTS SHOULD NOT BE FORCED TO DEPEND UPON INTERFACES THAT THEY DO NOT USE.”

翻译成中文就是“客户端不应该被强迫去依赖它们并不需要的接口”。

 

单纯从字面意思来看,ISP原则是5个原则中最好理解的一个了。但是我们深入思考一下,其实发现也没有那么简单。如果你还记得我们前面讲的那些原则,你可能会想到一个问题:既然有了SRP,为什么还要ISP?

 

现在我们来回想一下SRP原则,如果类满足了SRP原则,那么基于这个类提炼的接口不就自然而然的满足了ISP原则了么?为什么我们还要费神费力的又搞一个ISP原则呢?

 

Martin大师自然不会是吃饱了没事做,故意整个东东来折腾大家,他在ISP的论文中有这么一句话交代了ISP原则,可惜的是很多人都没有把这句话贴出来:

The ISP acknowledges that there are objects that require non-cohesive interfaces;

however it suggests that clients should not know about them as a single class. Instead, clients

should know about abstract base classes that have cohesive interfaces.

翻译一下:ISP原则承认对象需要非内聚的接口,然而ISP原则建议客户端不需要知道整个类,只需要知道具有内聚接口的抽象父类即可。

 

也就是说,ISP应用的场景是某些类不满足SRP原则,但使用这些类的客户端(即调用的类)应该根据接口来使用它,而不是直接使用它

 

虽然翻译了一下,但还是比较抽象,给个例子一看就明白了,而且已经有一个很好的例子了,即SRP原则中的“一体机”。

 

在“一体机”的样例中,虽然“一体机”同时具备“打印、复印、扫描、传真”的功能,但我们并不会设计一个“一体机”的接口,而是设计4个接口。这样调用接口的类可以根据自己需要精确使用某个接口,而不是调用一个大而全的接口。

 

具体代码如下:

ICopier.java

package com.oo.java.principles.isp;/** * 复印机接口 */public interface ICopier {        /**     * 复印     * @param paper     */    void copy(Paper paper);}


IFaxMachine.java

package com.oo.java.principles.isp;/** * 传真机接口 */public interface IFaxMachine {    /**     * 传真     * @param msg     */    void fax(String msg);}

IPrinter.java

package com.oo.java.principles.isp;/** * 打印机接口 */public interface IPrinter {        /**     * 打印     * @param doc     */    void print(Document doc);}

IScanner.java

package com.oo.java.principles.isp;/** * 扫描仪接口 */public interface IScanner {    /**     * 扫描     * @param paper     */    void scan(Paper paper);}

MultiFuncPrinter.java

package com.oo.java.principles.isp;/** * 多功能打印机(一体机) * 实现了IFaxMachine(传真机)、ICopier(复印机)、IPrinter(打印机)、IScanner(扫描仪)4个接口 * 而不是提供一个IMultiFuncPrinter的接口,同时提供以上接口的功能 * */public class MultiFuncPrinter implements IFaxMachine, ICopier, IPrinter, IScanner {    @Override    public void scan(Paper paper) {        // TODO Auto-generated method stub    }    @Override    public void print(Document doc) {        // TODO Auto-generated method stub    }    @Override    public void copy(Paper paper) {        // TODO Auto-generated method stub    }    @Override    public void fax(String msg) {        // TODO Auto-generated method stub    }}

People.java

package com.oo.java.principles.isp;/** * 人 */public class People {        /**     * 复印操作,copy方法依赖ICopier接口,而不是使用MutiFuncPrinter类     */    public void copy(ICopier copier, Paper paper){        copier.copy(paper);    }        /**     * 打印操作,print方法依赖IPrinter接口,而不是使用MutiFuncPrinter类     */    public void print(IPrinter printer, Document doc){        printer.print(doc);    }        /**     * 传真操作,fax方法依赖IFaxMachine接口,而不是使用MutiFuncPrinter类     */    public void fax(IFaxMachine faxer, String message){        faxer.fax(message);    }        /**     * 扫描操作,scan方法依赖IScanner接口,而不是使用MutiFuncPrinter类     */    public void scan(IScanner scanner, Paper paper){        scanner.scan(paper);    }}

Tester.java

package com.oo.java.principles.isp;public class Tester {    public static void mai(String args[]){        People people = new People();        MultiFuncPrinter mfp = new MultiFuncPrinter();                //如下函数都是使用mfp作为参数,但实际上是使用了MultiFuncPrinter类实现了的不同接口        people.copy(mfp, new Paper());     //使用了MultiFuncPrinter类的ICopier接口,        people.fax(mfp, "I love oo");      //使用了MultiFuncPrinter类的IFaxMachine接口,        people.print(mfp, new Document()); //使用了MultiFuncPrinter类的IPrinter接口,        people.scan(mfp, new Paper());     //使用了MultiFuncPrinter类的IScanner接口,    }}


================================================ 
转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/27698945
================================================ 



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上大班的孩子不愿写字怎么办 快上中班的小朋友不爱学习怎么办 小学生两边肩膀不平应该怎么办 写字右肩膀疼是怎么办 开车久了肩膀疼怎么办 3岁宝宝撕书怎么办 孩子上幼儿园不爱写字怎么办 一年级小孩不爱做作业怎么办 小孩不愿多做作业怎么办 小孩一年级不自觉做作业怎么办 小孩会读不会写怎么办 好多字都不会写怎么办 写作业怎么办才能写快 五周宝宝爱玩不写字怎么办 爱玩手机的小孩怎么办? 一年级学生记不住生字怎么办 一年级小孩记不住生字怎么办 配镜度数高了怎么办 宝宝两岁半不肯坐马桶拉臭臭怎么办 儿子字写得不好 怎么办 小孩不听话不爱读书和写字怎么办 两岁宝宝不愿意穿衣服怎么办 做题粗心不认真怎么办 5岁宝宝不会写字怎么办 四岁宝宝不会写字怎么办 4岁宝宝不写字怎么办 四岁宝宝不写字怎么办 孩子学习粗心计算能力差怎么办 一年级的小朋友不爱看书怎么办 马上要生了害怕怎么办 孩子做题不爱读题怎么办 孩子作业写的慢怎么办 孩子学习不好怎么办我们有绝招 英语不会做题怎么办呢? 小学二年级孩子厌学怎么办 狗狗拉肚子不吃东西怎么办 小孩做作业时容易发呆怎么办 一上高速就犯困怎么办 孩子初中数学学不好怎么办 高三注意力不集中怎么办 考砸了家长打我怎么办?