- 意圖
- 適用性
- 結(jié)構(gòu)
- 實(shí)現(xiàn)
- 效果
意圖
將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。
適用性
1.不希望抽象和實(shí)現(xiàn)間有固定的綁定關(guān)系
2.類的抽象以及它的實(shí)現(xiàn)都可以通過生成子類的方法加以擴(kuò)充
3.對抽象的實(shí)現(xiàn)部分的修改應(yīng)對客戶端不參產(chǎn)生影響
4.在多個對象中共享實(shí)現(xiàn)
結(jié)構(gòu)

實(shí)現(xiàn)
(這里所說的抽象層次和實(shí)現(xiàn)層次和面向?qū)ο蟮某橄蠛蛯?shí)現(xiàn)不同?把遙控器當(dāng)作抽象,電視機(jī)當(dāng)作實(shí)現(xiàn)是因?yàn)檫b控器本身不會開關(guān),只是命令電視機(jī)開關(guān)?這里抽象層次和實(shí)現(xiàn)層次的關(guān)系是聚合呀)
遙控器
public class RemoteControl { public TV tv; public void On() { tv.On(); } public void Off() { tv.Off(); } }
電視
public interface TV { void On(); void Off(); }
具體的電視
public class Sony:TV { public void On() { Console.WriteLine("SonyTV On."); } public void Off() { Console.WriteLine("SonyTV off"); } }
具體的遙控器
可擴(kuò)展
public class ConcreteRemote:RemoteControl { public ConcreteRemote(TV tv) { this.tv = tv; } public void AutoOff(int ms) { Thread.Sleep(ms); tv.Off(); } }
客戶
class PRogram { static void Main(string[] args) { TV sony = new Sony(); ConcreteRemote cr = new ConcreteRemote(sony); cr.On(); cr.AutoOff(5000); Console.ReadKey(); } }
運(yùn)行結(jié)果

效果
1.分離接口及其實(shí)現(xiàn)部分
2.提高可擴(kuò)充性
3.實(shí)現(xiàn)細(xì)節(jié)對客戶透明