文章目录
- 委托和代理
- 单例
委托和代理
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO1YTMzIWN1Q2NjR2M3QWOyYzXwIjNyETM2AzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
我们创建一个IWashBowl接口,里边有一个洗碗的方法
interface IWashBowl {
fun washing()
}
现在有大头儿子和小头爸爸,大头儿子洗碗赚1块钱,小头爸爸赚10块钱
class BigHeadSon:IWashBowl {
override fun washing(){
println("我是大头儿子,我洗碗赚1块钱")
}
}
class SmallHeadFather:IWashBowl {
override fun washing(){
println("我是小头爸爸,我洗碗赚10块钱")
}
}
测试代码
fun main(args: Array<String>) {
var son = BigHeadSon()
son.washing()
var father = SmallHeadFather()
father.washing()
}
、
那么什么是代理和委托呢,拿上边的例子来说明,当小头爸爸再有洗碗任务时,可以让大头儿子来洗,我们小头爸爸的代码
class SmallHeadFather:IWashBowl by BigHeadSon() {
}
写测试代码
fun main(args: Array<String>) {
var father = SmallHeadFather()
father.washing()
}
SmallHeadFather中也是可以重写
class SmallHeadFather:IWashBowl by BigHeadSon() {
override fun washing(){
println("我是小头爸爸,我看着大头儿子洗碗")
BigHeadSon().washing()
println("最终我还是赚了10块钱")
}
}
再次运行
单例
其实上边的代码是有瑕疵的,小头爸爸的
BigHeadSon().washing()
会创建出了一个大头儿子,如果测试代码中已经有
var son = BigHeadSon()
的话,就有2个大头了
var a = BigHeadSon();
var b = BigHeadSon();
println(a == b)
所以我们需要用到单例,先展示 Java 常见写法
public class Singleton{
private static Singleton instance;
private Singleton(){}
public synchronized static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
public void singletonTest(){
System.out.println("singletonTest is called");
}
}
调用单例中方法时,
Singleton singleton = Singleton.getInstance();
singleton.singletonTest();
在Kotlin 中创建单例十分简单,只要把关键字
class
改为
object
。我们来用 Kotlin 创建一个单例
object Singleton {
fun singletonTest(){
println("singletonTest is called")
}
}
调用单例类中的函数也很简单
Singleton.singletonTest();
下面修改 之前的栗子
object BigHeadSon:IWashBowl {
override fun washing(){
println("我是大头儿子,我洗碗赚1块钱")
}
}
小头爸爸的代码也需要修改,把小括号即可,代表我们不需要重新创建BigHeadSon了,并且大头儿子在内存中有且仅有一个
class SmallHeadFather:IWashBowl by BigHeadSon {
override fun washing(){
println("我是小头爸爸,我看着大头儿子洗碗")
BigHeadSon.washing()
println("最终我还是赚了10块钱")
}
}
var a = BigHeadSon;
var b = BigHeadSon;
println(a == b)