定義一個通用的介面

當「咖啡機」(CoffeeMachine)有很多種型號時,而顧客只需要其中一種,你可以使用介面繼承來解決這個問題。這樣你就可以定義一個通用的介面或基類,然後為不同型號的咖啡機建立具體的實現。顧客只會依賴於這個通用的介面,而不必知道具體是哪種型號的咖啡機。

使用介面來處理不同型號的咖啡機

  1. 定義一個 ICoffeeMachine 介面,這個介面描述咖啡機的通用功能,比如 MakeCoffee()
  2. 為不同型號的咖啡機實作這個介面,例如:BasicCoffeeMachineAdvancedCoffeeMachine
  3. 顧客(Customer)只依賴 ICoffeeMachine 介面,而實際上是哪一種咖啡機,則可以在建立顧客的時候傳入。

代碼示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// 定義咖啡機的通用介面
public interface ICoffeeMachine
{
void MakeCoffee();
}

// 基本型號的咖啡機
public class BasicCoffeeMachine : ICoffeeMachine
{
public void MakeCoffee()
{
Console.WriteLine("Making a basic coffee...");
}
}

// 進階型號的咖啡機
public class AdvancedCoffeeMachine : ICoffeeMachine
{
public void MakeCoffee()
{
Console.WriteLine("Making an advanced coffee with extra features...");
}
}

// 顧客類別依賴於 ICoffeeMachine 介面
public class Customer
{
private readonly ICoffeeMachine _coffeeMachine;

// 建構子注入依賴(咖啡機)
public Customer(ICoffeeMachine coffeeMachine)
{
_coffeeMachine = coffeeMachine;
}

public void OrderCoffee()
{
_coffeeMachine.MakeCoffee(); // 呼叫傳入的咖啡機來製作咖啡
}
}

class Program
{
static void Main(string[] args)
{
// 顧客可以選擇不同型號的咖啡機
ICoffeeMachine myCoffeeMachine = new BasicCoffeeMachine();
// 或者使用進階型號
// ICoffeeMachine myCoffeeMachine = new AdvancedCoffeeMachine();

// 建立顧客並傳入選擇的咖啡機
Customer customer = new Customer(myCoffeeMachine);

// 顧客下單要咖啡
customer.OrderCoffee(); // 輸出: Making a basic coffee... 或 Making an advanced coffee with extra features...
}
}

解釋:

  1. ICoffeeMachine 介面:這個介面定義了所有咖啡機應該具備的功能,比如 MakeCoffee()
  2. **BasicCoffeeMachineAdvancedCoffeeMachine**:這兩個類別分別代表不同型號的咖啡機,都實作了 ICoffeeMachine 介面,但具體的製作咖啡過程不同。
  3. Customer 類別:顧客依賴於 ICoffeeMachine 介面,而不依賴具體的咖啡機型號。因此,在顧客的建構子中,我們可以傳入任何實作了 ICoffeeMachine 介面的咖啡機。
  4. Main 方法:在主程式中,我們可以選擇不同型號的咖啡機(BasicCoffeeMachineAdvancedCoffeeMachine),然後將它傳入 Customer,顧客只需要使用咖啡機製作咖啡,無需關心具體型號。

好處:

  • 靈活性:你可以輕鬆地新增不同型號的咖啡機,而不需要修改顧客的程式碼。
  • 依賴倒置原則:顧客依賴於介面或抽象,而不是具體的實作,這讓程式碼更具彈性與可擴展性。

這樣的設計模式常見於大型應用程式中,有助於處理依賴關係和實現功能的多樣化。