委托 by Delegation

類別委托

Kotlin的委托,我覺得十分像設計模式中的代理人模式

就是旅客跟旅行社買機票,但實際付錢是旅客付。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// BuyTicket介面 要做的事
interface BuyTicket {
    fun pay()
}

// 旅客實作BuyTicket介面的pay方法。
// 真正要做事的人
class Tourist : BuyTicket {
    override fun pay() = println("旅客提供信用卡 卡號付錢")
}

// 旅行社實作BuyTicket介面的pay方法,實際上是旅客付錢。
// 代理人
class Agency(tourist: BuyTicket) : BuyTicket by tourist
1
2
3
4
5
6
7
8
fun main() {
    // 真正要做事的人
    val tourist = Tourist()
    // 代理人,把 真正要做事的人 的傳入
    val agency = Agency(tourist)
    // 實際上是旅客付錢,不是代理人付錢
    agency.pay()
}
旅客提供信用卡 卡號付錢

以上的內容要有Java程式碼對映才比較明白。

BuyTicket介面

1
2
3
public interface BuyTicket {
  void pay();
}

旅客實作BuyTicket介面的pay方法。

1
2
3
4
5
6
public class Tourist implements BuyTicket{
  @Override
  public void pay() {
    System.out.println("旅客提供信用卡 卡號付錢");
  }
}

旅行社實作BuyTicket介面的pay方法,實際上是旅客付錢。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Agency implements BuyTicket{
  // 成員屬性要有旅客Tourist
  private Tourist tourist;

  // 使用建構子參數,把旅客傳入旅行社
  public Agency(Tourist tourist) {
    this.tourist = tourist;
  }

  @Override
  public void pay() {
    // 實際上是呼叫旅客的pay()方法
    tourist.pay();
  }
}

Client測試

1
2
3
4
5
6
7
8
9
10
public class Client {
  public static void main(String[] args) {
    // 建立旅客
    Tourist tourist = new Tourist();
    // 把旅客傳入旅行社的建構子
    Agency agency = new Agency(tourist);
    // 旅行社付錢,實際上旅客付的。
    agency.pay();
  }
}
旅客提供信用卡 卡號付錢

語法

class 代理人(真正要做事的人: 要做的事) : 要做的事 by 真正要做事的人
class Agency(tourist: BuyTicket) : BuyTicket by tourist

results matching ""

    No results matching ""