1、背景
现在有一个使用场景:司机开车
一般这样写
Public Driver{ //司机
...
public void drive(){
Car mCar=new Car(“汽车”);
mCar.dianHuo();//点火
mCar.guaDang();//挂档
mCar.caiYouMen();//踩油门
mCar.daFangXiang();//打方向
...
}
}
2、问题
(1)耦合度高:Driver中创建和持有Car这个类,管理Car的生命周期
(2)不易维护: Car的通用性太强,无法细分汽车型号等等参数(比如自动挡和手动挡),以实现不同处理(不同汽车,点火,挂档,踩油门,打方向等等操作,各不相同)
3、解决思路
背景中的例子,实质是“开XX汽车的司机,开车”,核心是开XX车;司机不是重点;如何开车,司机依赖于车的属性。
所以,需要将司机的依赖对象车,注入到司机中,司机不需要自行引用车子,这个过程司机不需要关注。
4、具体方案
(1)Car公共属性接口
public interface ICar {
public void dianHuo();//点火
public void guaDang();//挂档
public void caiYouMen();//踩油门
public void daFangXiang();//打方向
…
}
(2)不同的Car的类
宝马
public class BaoMa implements ICar {//宝马
public void dianHuo()
{
…
}
public void guaDang()
{
…
}
public void caiYouMen()
{
…
}
public void daFangXiang()
{
…
}
…
}
法拉利
public class FaLaLi implements ICar {//法拉利
public void dianHuo()
{
…
}
public void guaDang()
{
…
}
public void caiYouMen()
{
…
}
public void daFangXiang()
{
…
}
…
}
3、司机
Public Driver{
private ICar mCar;
public Driver(ICar onecar){
mCar = onecar;
}
public void drive(){
mCar.dianHuo();//点火;
mCar.guaDang();//挂档;
mCar.caiYouMen();//踩油门;
mCar.daFangXiang();//打方向;
}
...
}
4、具体实现
//开宝马的司机,开车
BaoMa baoMa=new BaoMa();
Driver mDriverByBaoMa=new Driver(baoMa);
mDriverByBaoMa.drive();
//开法拉利的司机,开车
FaLaLi faLaLi=new FaLaLi();
Driver mDriverByFaLaLi=new Driver(faLaLi);
mDriverByFaLaLi.drive();