1. 程式人生 > >代理模式、橋接模式、中介者模式、命令模式

代理模式、橋接模式、中介者模式、命令模式

相似點

開始的時候,這四個模式在名字上的意思有相似的地方,在實際生活中,如房屋中介、買房人、賣房人,房屋中介當然是一箇中介,因為它負責買房人和賣房人之間的溝通;房屋中介也是一個代理,它在賣房人面前是買房人的代理,在賣房人面前時買房人的代理;房屋中介也是一個橋接,用於連線買房人和賣房人;房屋中介也可以是命令的傳達者,買房人將買房的命令傳送給中介,中介根據命令找到相應的賣房人。那這字面意思相似的四者到底有什麼不同的使用場合。

UML


代理模式

中介模式

橋接模式

命令模式

代理模式

使用場合

1. 做過Android的都應該知道Android的程序間通訊是Binder,Binder的客戶端呼叫服務端都是通過呼叫服務端在客戶端程序的代理進行的,由於客戶端無法和服務端直接通訊,因為他們在兩個程序,所以這個代理其實就通過程序間通訊和服務端互動,但是看起來就好像客戶端直接和服務端通訊一樣。

2. 引用計數,C++利用引用計數來管理物件記憶體的回收,我們在使用這個物件時,都是通過引用計數來操作的,因為我們不知道這個物件實際的地址,這個引用計數就是該物件的代理;所以,上面的UML圖不一定是準確的,代理和被代理物件不一定繼承於一個基類,它們之間可以沒有任何關係;

特點

1. 一對一,這個代理只能代表一個物件;

2. 只能代理一方,也就是 PB 是B的代理,A能夠通過PB訪問B,但是B不能通過PB訪問A;

中介模式

使用場合

1. Android的Binder的總服務ServiceManager就是一箇中介者,它們負責所有的客戶端和所有服務之間的通訊;

特點

1. 多對多,這些被管理的物件之間都可以通訊,它們的業務關係應該是交織在一起的;

2. A能夠通過中介訪問B,B也能夠通過中介訪問A;

橋接模式

使用場合 當一個類有很多屬性時,我們可以通過繼承的方式來繼承這些屬性,但是如果屬性不穩定時,繼承會造成大量的繼承類,所以這個時候使用組合或者聚合更好一些; 特點 1. 一對多的關係,一個類可以有很多其他屬性; 2. 橋接強調不是物件之間的通訊,而是擁有某些屬性;

命令模式

使用場合
根據某種情況呼叫不同的處理者時,而且情況的個數不確定,很有可能在以後會進行相應的增加或者減少的,就需要使用命令模式; 特點 1. 多對多的關係,負責多對多之間的通訊; 2. 命令模式更多時候是命令的個數是不確定的,當增加命令時,只要增加相應的命令和修改中間的傳達者即可,其他不需要修改;

區別

1. 我們可以看出,中介者模式和代理模式和命令模式比較相似,他們強調的是通訊,橋接模式強調的時候擁有屬性; 2. 中介者模式是多對多通訊,代理是一對一通訊,橋接是一對多,命令模式是多對多通訊; 3. 代理是通訊只能從一方到另外一方,中介者是雙向都可以通訊; 4. 中介者和代理模式一般介面是固定的(即請求比較固定),而命令模式請求一般不固定,可能會改變,所以將命令進行物件化和獨立化使得程式碼更加靈活;