/* * 感觉车2设计更合理些,但看了很多开源框架,都是采用车1的形式 * 车1的弊端是,同一个oil对象存在两个指针,如果哪天加一个setOil方法 * 就要同时修改车和发动机里面油的引用。 */ public class 车1 { 油 oil; 发动机1 engine; 车1(油 oil){ this.oil = oil; engine = new 发动机1(oil); } void 启动(){ engine.启动(); } } class 车2 { 油 oil; 发动机2 engine; 车2(油 oil){ this.oil = oil; engine = new 发动机2(); } void 启动(){ engine.启动(oil); } } class 油{ int i = 5; } class 发动机1{ 油 oil; 发动机1(油 oil){this.oil=oil;}; void 启动(){ oil.i--; } } class 发动机2{ 发动机2(){}; void 启动(油 oil){ oil.i--; } }
哪个类设计得更好呢?车1还是车2?
目测关系差不多,车子和 发动机、油 有关系;发动机和油有关系。
不同的是 发动机1和油是组合,发动机2和油是依赖,所以 耦合度 发动机2 更小,车2合理。
赞同
@世界万物: 我目前也是觉得车2要好些,最近看的一些开源框包出现的是车1的设计样式,比如httpclient。所有我发个博客,想问问,车1有没有我目前没想到的好处。
你的油可以使抽象的啊,改变的油只要重新实现一个不就得了,用不着修改
你的发动机2的启动方法还要用个参数油,到时候你怎么能保证这个油是在这个汽车的油箱呢?不太合理吧!
车1合理
对于你的第一个问题:我说的修改,不是在初始化的时候修改,而是在运行过程中修改。针对你提到的,我们也可以扩展下,比如有两种油,分别油1和油2,都是油的子类。这两种油在发动机的消耗是不同的,比如油1每公里100g,油2每公里200g。刚开始初始化的时间,传入的是油1 ,后来油1用完了,用set方法改为油2 ,就要修改两处。
你的第2个问题:说到点子上了,正因为它是作为一个参数来传的,这个参数由它的宿主来传递,耦合相对小些,如果是汽车,汽车有个油箱(一个油的属性)就由汽车来供,如果换成卡车,也是这样。
@angelshelter: 按照你的说法, 油也应该是一个类,这个时候你的启动要调用油的一个耗油的方法,不然你以后再怎么设计都是不正确的
第二点,我还是觉得发动机2的设计不合理,如果这个是多态的话,你能确定你用的油是那辆车里面的油?
@刘宏玺: 对于你的第一个问题,我觉得油可以有很多种,但耗油的方法并不应该放在油类里面,而应该是发动车里面,发动车根据不同的油,输出不同的效果。
对于你的第二个问题,我反问一下,我有必要确定是哪辆车里面的油吗?多态是继承关系,又不是共享关系。总不是父类有一个oil的属性,各个实现它的子类都调用它,存在混淆吧。