15.1 类的委托

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()}")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值