代理模式(Proxy):為某個對象提供一種代理以控制對這個對象的訪問。
注意:代理模式和策略模式的類圖很相近,實現方法也是一樣的,但是應用情境很不一樣,體現了不同的思想。
策略模式中同一外部對象訪問內容物件的操作一樣,但是裡面的策略對象不同。
代理模式中不同的外部對象訪問代理對象的操作一樣,但是裡面的真實對象是一樣的。
代理模式在訪問對象時引入一定程度的間接性,因為這種間接性,可以附加多種用途。
應用情境:
1、遠程代理。為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在於不同地址空間的事實。
2、虛擬代理。當要建立耗時很長的對象時,可以使用虛擬代理。虛擬代理完成的工作為建立真實對象,並在建立的過程中給出提示。比如在網頁載入圖片的過程中,虛擬代理可以用一個圖片框暫時替代真實的圖片。
3、安全代理。用於控制真實對象訪問是的許可權。
4、智能指引。當調用真實的對象時,代理處理另外一些事情,比如計算真實對象的引用次數、是否鎖定等等。
#encoding=utf-8##by panda#代理模式def printInfo(info): print unicode(info, 'utf-8').encode('gbk')class SchoolGirl(): Name = '' def __init__(self, name): self.Name = name class GiveGift(): """介面類:定義通用操作""" def GiveDolls(self): return def GiveFlowers(self): return def GiveChocolate(self): return class Pursuit(GiveGift): mm = None def __init__(self, mm): self.mm = mm; return; def GiveDolls(self): printInfo("代理模式:") printInfo("送 %s 洋娃娃" % self.mm.Name) return def GiveFlowers(self): printInfo("代理模式:") printInfo("送 %s 鮮花" % self.mm.Name) return def GiveChocolate(self): printInfo("代理模式:") printInfo("送 %s 巧克力" % self.mm.Name) return class Proxy(GiveGift): gg = None def __init__(self, mm): self.gg = Pursuit(mm); return; def GiveDolls(self): self.gg.GiveDolls() return def GiveFlowers(self): self.gg.GiveFlowers() return def GiveChocolate(self): self.gg.GiveChocolate() return def clientUI(): mm = SchoolGirl(r"韓梅梅") proxy = Proxy(mm) proxy.GiveDolls() proxy.GiveFlowers() proxy.GiveChocolate() returnif __name__ == '__main__': clientUI();
類圖: