Differences between revisions 5 and 8 (spanning 3 versions)
Revision 5 as of 2006-06-16 09:03:00
Size: 1924
Editor: HoLin
Comment:
Revision 8 as of 2009-12-25 07:15:56
Size: 1719
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
-- flyaflya [[[DateTime(2005-08-04T09:20:24Z)]]]
[[TableOfContents]]
-- flyaflya [<<DateTime(2005-08-04T09:20:24Z)>>]
<<TableOfContents>>
Line 8: Line 8:
为其他对象提供一种代理以控制对这个对象的访问。[[BR]]
attachment:ProxyPattern.gif
为其他对象提供一种代理以控制对这个对象的访问。<<BR>>
{{attachment:ProxyPattern.gif}}
Line 45: Line 45:
{{{
Line 46: Line 47:
Line 48: Line 48:
Line 52: Line 51:
Line 54: Line 52:
Line 58: Line 55:
Line 60: Line 56:
Line 64: Line 59:
0
}}}
Line 65: Line 62:
0 === 特殊说明 ===
 * 因为在Proxy中没有`__setattr__`函数,因此只可以得到rgb中的值,但不能改变,比如可以`"r = noblue._RBG__red"`,但不能写`"noblue._RBG__red = 255"`,如果要想改变RBG中的值,只有在RBG中定义一些函数如"setBlue...",在noblue中直接调用。
 * 在Proxy中也不能定义`__setattr__`,否则在`__init__`中会发生死循环。
Line 67: Line 66:
}}}
使用:
>>> 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__中会发生死循环。
Line 94: Line 67:
 * 这个看得不是很明白,和java里强制的属性set,get有什么区别? --[:holin: HoLin]  * 这个看得不是很明白,和java里强制的属性set,get有什么区别? --[[holin| HoLin]]

-- flyaflya [2005-08-04 09:20:24]

1. Proxy(代理)

1.1. 意图

为其他对象提供一种代理以控制对这个对象的访问。
ProxyPattern.gif

1.2. 代码

   1 class Proxy:
   2     def __init__( self, subject ):
   3         self.__subject = subject
   4     def __getattr__( self, name ):
   5         return getattr( self.__subject, name )   

1.3. 例子

   1 class RGB:
   2     def __init__( self, red, green, blue ):
   3         self.__red = red
   4         self.__green = green
   5         self.__blue = blue
   6     def Red( self ):
   7         return self.__red
   8     def Green( self ):
   9         return self.__green
  10     def Blue( self ):
  11         return self.__blue 

使用Proxy改变Blue函数:

   1 class NoBlueProxy( Proxy ):
   2     def Blue( self ):
   3         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  

1.4. 特殊说明

  • 因为在Proxy中没有__setattr__函数,因此只可以得到rgb中的值,但不能改变,比如可以"r = noblue._RBG__red",但不能写"noblue._RBG__red = 255",如果要想改变RBG中的值,只有在RBG中定义一些函数如"setBlue...",在noblue中直接调用。

  • 在Proxy中也不能定义__setattr__,否则在__init__中会发生死循环。

1.5. 反馈

  • 这个看得不是很明白,和java里强制的属性set,get有什么区别? --HoLin

ProxyPattern (last edited 2009-12-25 07:15:56 by localhost)