## page was renamed from zhArticleTemplate ##language:zh #pragma section-numbers on -- flyaflya [<>] <> == Proxy(代理) == === 意图 === 为其他对象提供一种代理以控制对这个对象的访问。<
> {{attachment:ProxyPattern.gif}} === 代码 === {{{ #!python class Proxy: def __init__( self, subject ): self.__subject = subject def __getattr__( self, name ): return getattr( self.__subject, name ) }}} === 例子 === {{{ #!python class RGB: def __init__( self, red, green, blue ): self.__red = red self.__green = green self.__blue = blue def Red( self ): return self.__red def Green( self ): return self.__green def Blue( self ): return self.__blue }}} 使用Proxy改变Blue函数: {{{ #!python class NoBlueProxy( Proxy ): def Blue( self ): return 0 }}} 使用: {{{ >>> rgb = RGB( 100, 192, 240 ) >>> rgb.Red() 100 >>> proxy = Proxy( rgb ) >>> proxy.Green() 192 >>> noblue = NoBlueProxy( rgb ) >>> noblue.Green() 192 >>> noblue.Blue() 0 }}} === 特殊说明 === * 因为在Proxy中没有`__setattr__`函数,因此只可以得到rgb中的值,但不能改变,比如可以`"r = noblue._RBG__red"`,但不能写`"noblue._RBG__red = 255"`,如果要想改变RBG中的值,只有在RBG中定义一些函数如"setBlue...",在noblue中直接调用。 * 在Proxy中也不能定义`__setattr__`,否则在`__init__`中会发生死循环。 === 反馈 === * 这个看得不是很明白,和java里强制的属性set,get有什么区别? --[[holin| HoLin]]