隔离技术操作原则

隔离技术操作原则

接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块。接口隔离原则不应该强迫客户端依赖于他们不会使用的接口。实例下面是一个违反了接口隔离原则的例子。我们使用Manager类代表一个管理工人的管理者。有两种类型的工人:普通的和高效的,这两种工人都需要吃午饭。现在来了一批机器人,它们同样为公司工作,但是他们不需要吃午饭。一方面Robot类需要实现IWoker接口,因为他们要工作,另一方面,它们又不需要实现IWorker接口,因为它们不需要吃饭。在这种情况下IWorker就被认为是一个被污染了的接口。如果我们保持现在的设计,那么Robot类将被迫实现eat()方法,我们可以写一个哑类它什么也不做(比如说它只用一秒钟的时间吃午饭),但是这会对程序造成不可预料的结果(例如管理者看到的报表中显示被带走的午餐多于实际的人数)。根据接口隔离原则,一个灵活的设计不应该包含被污染的接口。对于我们的例子来说,我们应该把IWorker分离成2个接口。3.interfaceIWorker{4.publicvoidwork();5.6.publicvoideat();7.}8.9.classWorkerimplementsIWorker{10.publicvoidwork(){11.//.working12.}13.14.publicvoideat(){15.//eatinginlaunchbreak16.}17.}18.19.classSuperWorkerimplementsIWorker{20.publicvoidwork(){21.//.workingmuchmore22.}23.24.publicvoideat(){25.//.eatinginlaunchbreak26.}27.}28.29.classManager{30.IWorkerworker;31.32.publicvoidsetWorker(IWorkerw){33.worker=w;34.}35.36.publicvoidmanage(){37.worker.work();38.}39.}//interfacesegregationprinciple-badexampleinterfaceIWorker{publicvoidwork();publicvoideat();}classWorkerimplementsIWorker{publicvoidwork(){//.working}publicvoideat(){//eatinginlaunchbreak}}classSuperWorkerimplementsIWorker{publicvoidwork(){//.workingmuchmore}publicvoideat(){//.eatinginlaunchbreak}}classManager{IWorkerworker;publicvoidsetWorker(IWorkerw){worker=w;}publicvoidmanage(){worker.work();}}下面是遵循接口隔离原则的代码。通过把IWorker分离成两个接口,Robot类不需要再被强迫实现eat()方法。如果我们需要为Robot类添加其他的功能,例如重新充电,我们可以创建一个新的IRechargeable接口,其中包含一个重新充电的方法recharge。Java代码复制代码1.//interfacesegregationprinciple-goodexample2.3.interfaceIWorkable{4.publicvoidwork();5.}6.7.interfaceIFeedable{8.publicvoideat();9.}10.11.classWorkerimplementsIWorkable,IFeedable{12.publicvoidwork(){13.//.working14.}15.16.publicvoideat(){17.//.eatinginlaunchbreak18.}19.}20.21.classSuperWorkerimplementsIWorkable,IFeedable{22.publicvoidwork(){23.//.workingmuchmore24.}25.26.publicvoideat(){27.//.eatinginlaunchbreak28.}29.}30.31.classRobotimplementsIWorkable{32.publicvoidwork(){33.//.working34.}35.}36.37.classManager{38.IWorkableworker;39.40.publicvoidsetWorker(IWorkablew){41.worker=w;42.}43.44.publicvoidmanage(){45.worker.work();46.}47.}//interfacesegregationprinciple-goodexampleinterfaceIWorkable{publicvoidwork();}interfaceIFeedable{publicvoideat();}classWorkerimplementsIWorkable,IFeedable{publicvoidwork(){//.working}publicvoideat(){//.eatinginlaunchbreak}}classSuperWorkerimplementsIWorkable,IFeedable{publicvoidwork(){//.workingmuchmore}publicvoideat(){//.eatinginlaunchbreak}}classRobotimplementsIWorkable{publicvoidwork(){//.working}}classManager{IWorkableworker;publicvoidsetWorker(IWorkablew){worker=w;}publicvoidmanage(){worker.work();}}总结如果已经设计成了胖接口,可以使用适配器模式隔离它。像其他设计原则一样,接口隔离原则需要额外的时间和努力,并且会增加代码的复杂性,但是可以产生更灵活的设计。如果我们过度的使用它将会产生大量的包含单一方法的接口,所以需要根据经验并且识别出那些将来需要扩展的代码来使用它。
温馨提示:答案为网友推荐,仅供参考
相似回答