62

设计模式之代理模式

 6 years ago
source link: http://www.10tiao.com/html/605/201806/2654251618/4.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!


代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。


代理模式的模型如下:

#设计模式——代理模式
#代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问

#模型:
#公共接口类
class InterFace:
   def request(self):
       pass
#真实类
class RealSubject(InterFace):
   def request(self):
       print 'RealSubject request'
#代理类 调用真实类的内部方法
class ProxySubject(InterFace):
   def request(self):
       self.real = RealSubject()
       self.real.request()

有个非常典型的例子,某男生追求女生,但是不敢向其表白,所以委托另外一男生为代理,代他送礼物给女生。实现这个需求的重点是,男生和女生是不互相直接接触的,都是通过代理男生,实现间接接触。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = 'Andy'

"""
实现:戴励 替 卓贾易 送礼物给 娇娇
"""


# 送礼物接口
class GiveGift(object):
   # 送洋娃娃
   def GiveDolls(self):
       pass

   # 送花
   def GiveFlowers(self):
       pass

   # 送巧克力
   def GiveChocolate(self):
       pass

# 被追求者类
class SchoolGirl(object):
   def __init__(self, name):
       self.name = name

# 追求者类
class Pursuit(GiveGift):
   def __init__(self, Girl):
       self.Girl = Girl

   def GiveDolls(self):
       print self.Girl.name, '送你洋娃娃'

   def GiveFlowers(self):
       print self.Girl.name, '送你花'

   def GiveChocolate(self):
       print self.Girl.name, '送你巧克力'

# 代理类
class Proxy(GiveGift):
   def __init__(self, Girl):
       self.proxy = Pursuit(Girl)

   # 送洋娃娃
   def GiveDolls(self):
       self.proxy.GiveDolls()

   # 送花
   def GiveFlowers(self):
       self.proxy.GiveFlowers()

   # 送巧克力
   def GiveChocolate(self):
       self.proxy.GiveChocolate()

if __name__ == '__main__':
   jiaojiao = SchoolGirl('jiaojiao')
   daili = Proxy(jiaojiao)
   daili.GiveDolls()
   daili.GiveFlowers()
   daili.GiveChocolate()

上面的类的设计如下图: 

代理类Proxy引用代理的实体Pursuit,提供与Pursuit相同的接口来代替实体。



  • 作者:Andy 

  • 原文链接:http://www.cnblogs.com/onepiece-andy/

  • 程序员大咖整理发布,转载请联系作者获得授权

【点击成为Java大神】


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK