15.1 类的委托
标签(空格分隔): kotlin 出版
书名:Kotlin基础教程
作者:陈小默
为了更好的理解委托,我们用Java语言实现一个改装车的案例来展示委托类到底是如何运转的:
首先定义车的行为,这辆车有型号信息model,有车牌号number,还有时速信息speed
interface Car {
String model();
String number();
int speed();
}
现在,我买了属于自己的车MyCar,这辆车的最高时速为250km/h
class MyCar implements Car {
@Override
public String model() {
return "BMW";
}
@Override
public String number() {
return "京A 00000";
}
@Override
public int speed() {
return 180;
}
}
假如我是一名赛车爱好者,我觉得车速太低,所以我要对这辆车进行改装。这里我们采取的是包装类Wrapper设计模式作为改装的工具,该类的作用是将传入的车速提升3倍。使用包装类设计模式最重要的一点就是只包装需要修改的部分,对于不需要修改的部分仍使用原方法。
class Tuning implements Car {
Car car;
public Tuning(Car car) {
this.car = car;
}
@Override
public String model() {
return car.model();
}
@Override
public String number() {
return car.number();
}
@Override
public int speed() {
return car.speed() * 3;
}
}
现在我们测试一下车的改装效果:
public static void main(String[] args) {
Car myCar = new MyCar();
System.out.println("改装之前");
System.out.println("车型号:" + myCar.model() + " 车牌号:" + myCar.number() + " 最高时速:" + myCar.speed());
myCar = new Tuning(myCar);
System.out.println("改装之后");
System.out.println("车型号:" + myCar.model() + " 车牌号:" + myCar.number() + " 最高时速:" + myCar.speed());
}
改装之前
车型号:BMW 车牌号:京A 00000 最高时速:250
改装之后
车型号:BMW 车牌号:京A 00000 最高时速:750
到目前我们的车就算改装成功了。可是包装类的例子跟我们要讲的委托类有什么关系?答案是,委托类的实现方式正是包装类设计模式,使用Kotlin的委托类实现上述例子:
class MyCar : Car {
override fun model() = "BMW"
override fun number() = "京A 00000"
override fun speed() = 250
}
如果我们写成class Tuning(var car: Car) : Car by car
的方式,参照上述Java的例子可以知道其内部实现的每一个方法都调用的参数car的对应方法。如果我们想自定义行为,比如提升3倍的最高时速时我们仅仅需要重写对应的方法即可:
class Tuning(var car: Car) : Car by car {
override fun speed() = 3 * car.speed()
}
我们在main方法中调用可以得到上述相同的结果
fun main(args: Array<String>) {
var myCar: Car = MyCar()
println("改装之前")
println("车型号:${myCar.model()} 车牌号:${myCar.number()} 最高时速:${myCar.speed()}")
myCar = Tuning(myCar)
println("改装之后")
println("车型号:${myCar.model()} 车牌号:${myCar.number()} 最高时速:${myCar.speed()}")
}