---
# System prepended metadata

title: Design Pattern 前情提要
tags: [design pattern]

---

# Design Pattern 前情提要

###### tags:  `design pattern`

- **模式** 一種反覆出現的行為模式或特性。
- **耦合性** 一種軟體度量，是指一程式中，模組及模組之間資訊或參數依賴的程度。
- **UML**是用来設計軟體藍圖的可視化建模語言，UML 從目標系統的不同角度出發。
- **委託**是對函數的封裝，可以當作給方法的特徵指定一個名稱。而**事件**則是委託的一種特殊形式，當發生有意義的事情時，事件對象處理通知過程。
- **接口(Interface，介面)** 是類別的規範
	- 它具有類的結構但不可被實例化，只可以由子類實現。
	- 它包含抽象操作，但接口裡只能定義靜態常量public static 屬性，不能定義普通屬性。
	- 它描述了類或組件對外可見的動作
	- 全部都是抽象方法時，可以通過接口的方式來實現。
	- 避免多重繼承的複雜性和低效性的同時，提供的多重繼承的好處。
- **抽象類(abstract class)** 是不能直接實例化的類別
	- 不可被實例化，只能被繼承。
	- 包含抽象方法一定是抽象類，但抽象類不一定含有抽象方法
	- 抽象類的抽象方法只能為public或者protected，默認為public
	- 一個子類繼承抽象類，則子類必須實現父類抽象方法，否則子類也必須定義為抽象類。
	- 可以有包含屬性、方法、建構方法，但建構方法不能用於實例化，主要用途子類調用。

- [**抽象類 vs. 接口**](https://zhuanlan.zhihu.com/p/94770324)
	1. 類是物件的抽象，抽象類是類的抽象，接口是對行為的抽象。
	2. 接口是對類局部行為進行抽象。抽象類是對類整體的抽象。只關注行為抽象，那麼接口就是抽象類。
	3. 行為跨越不同的類的對象，可使用接口。相似的類可繼承抽象類。
	4. 抽象類是從子類發現公共的東西，而泛化出抽象父類。而接口不知道子類的存在，方法如何實現也不確定，預先定義，思維過程不同。抽象類往往是重構得來的。抽象類是自底向上抽象出來，接口則是自頂向下設計出來的。
	> 例子：貓、狗都是繼承動物這抽象類。飛機、麻雀、超人是完全不相關的類，但因為都會飛，可以讓他們來實現相同的接口。
	先有貓類、狗類，觀察後發現類似之處，於是泛化出動物這抽象類。動物運動會主辦方策劃時，是先定義這些比賽的項目的行為接口。
	5. 一個類只能繼承一個抽像類，而一個類卻可以實現多個接口。
	> 在Java中，類的多繼承是不合法，但接口允許多繼承。
	6. 區別

	| 區別         | 抽象類                           | 接口                   |
	| ------------ | -------------------------------- | ---------------------- |
	| 建構子       | 可以有                           | 不能有                 |
	| 普通成員變量 | 可以有                           | 沒有                   |
	| 靜態方法     | 可以有                           | 不能有                 |
	|              | 一個類只能繼承一個抽象類         | 一個類可以實現多個接口 |
	|              | 至少有一個抽象方法，其餘方法可以實現 | 全部都是抽象方法，不能實現       |
	|              | 一個類只能繼承一個抽象類                   | 可多重實現多個接口         |
	|              | 抽象成員可被子類部分實現                                 |                 實現類必須完全實現方法、子類可以也是接口       |
	7. 相同
		1. 都不能被實例化
		2. 接口的實現類或抽像類的子類都只有實現了接口或抽像類中的方法後才能實例化。
		3. 可以實現多型



