java 设计模式之依赖倒置实例详解
本文实例讲述了java设计模式之依赖倒置。分享给大家供大家参考,具体如下:
依赖倒置的概念我也是在一篇博文上理解的,我觉得很精辟,所以收录在我的博客中。
类A依赖类B,之后根据需求类A变换为依赖类C,这时候我们认为类A是高层模块,类B和类C是低层模块。
什么是高层模块?什么是底层模块?
高层模块你可以理解为控制层,负责复杂的业务逻辑。
低层模块你可以理解为数据层,负责基本的原子操作。
什么意思?我举个例子。
比如大胃王比赛。
在这场比赛中的规则是比赛谁吃馒头吃的最多。有参赛选手Q和W
/** *馒头实体类 */ classSteamedBuns { privateStringname="馒头"; publicStringgetName() { returnthis.name; } } classPlayer { //得了多少分 privateintintgral; privateStingname; publicPlayer(Stringname) { setName(name); } publicvoidsetName(Stringname) { this.name=name; } publicStringgetName() { returnname; } publicvoidsetIntgral(intintgral) { this.intgral=intgral; } publicintgetIntgral() { returnthis.intgral; } publicvoideat(SteamedBunssteamedBuns) { System.out.println("我开吃了"); setIntgral(getIntgral()+1); } } publicclassMain { pubicstaticvoidmain(String[]agrs) { Playerq=newPlayer("Q");//选手Q Playerw=newPlayer("W");//选手W q.eat(newSteamedBuns());//选手Q吃馒头 w.eat(newSteamedBuns());//选手W吃馒头 } }
那么,之后问题来了。Q和W比分一样,胃口太大把馒头吃光了,现在好追加比赛吃包子。但Q和W的实体只支持吃馒头,这个不符合情理哇,不可能一个人能吃馒头不能吃包子哇。
publicvoideat(SteamedBunssteamedBuns)//选手只支持吃馒头
有的同学可能会想到用重载这个方法。
publicvoideat(SteamedBunssteamedBuns){}//选手支持吃馒头 publicvoideat(SteamedStuffedBunsteamedStuffedBun){}//选手支持吃包子
思路是正确的,但是在实际开发中,这样做,可能会给程序带来不必要的风险。
这时候依赖倒置的优越性就体现出来了。
还是思考。既然馒头吃光了,现在要比赛吃包子,那么我们想一下如果包子也吃光了还没有分出胜负,要继续追加比赛怎么办?再用重载吗?人都是可以吃食物的,我们要让包子和馒头都实现食物接口。而参赛选手的依赖应该从包子和馒头抽象出来依赖食物接口。这样只要一个类实现了食物接口,那么都能被吃。
/** *食物接口 */ interfaceFood { publicStringgetName(); } /** *馒头实体类 */ classSteamedBunsimplementsFood { privateStringname="馒头"; @Override publicStringgetName() { returnthis.name; } } /** *包子实体类 */ classSteamedStuffedBunimplementsFood { privateStringname="包子"; @Override publicStringgetName() { returnthis.name; } } classPlayer { privateintintgral; privateStingname; publicPlayer(Stringname) { setName(name); } publicvoidsetName(Stringname) { this.name=name; } publicStringgetName() { returnname; } publicvoidsetIntgral(intintgral) { this.intgral=intgral; } publicintgetIntgral() { returnthis.intgral; } /**取消对具体食物种类的依赖 publicvoideat(SteamedBunssteamedBuns) { System.out.println("我开吃了"); setIntgral(getIntgral()+1); } */ publicvoideat(Foodfood) { System.out.println("我开吃了"); setIntgral(getIntgral()+1); } } publicclassMain { pubicstaticvoidmain(String[]agrs) { Playerq=newPlayer("Q");//选手Q Playerw=newPlayer("W");//选手W q.eat(newSteamedBuns());//选手Q吃馒头 w.eat(newSteamedBuns());//选手W吃馒头 q.eat(newSteamedStuffedBun());//选手Q吃包子 w.eat(newSteamedStuffedBun());//选手W吃包子 } }
这样的设计有助于降低类之间的耦合程度,抽象稳定的多,细节交给实现类。
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。