# -*- coding: utf-8 -*-

__author__ = 'Administrator'

#python高级编程:有用的设计模式

#代理

"""

代理对一个代价昂贵或者远程的资源提供了一个非直接访问的机制

在客户和主意之间,如图.它用来优化对高代价主题的访问,比如,在前一章中描述的memoize装饰器可以被认为是一个代理

,它还可以用提供到一个主题智能访问,例如,大的视频文件可以封闭在代理中,以避免在用户仅仅请教其标题时就将文件载入到内存中

urllib2出给了一个例子,如下:

"""

from urllib2 import *

class Url(object):

def __init__(self,url):

self._url=urlopen(url)

def headrs(self):

return dict(self._url.headers.items())

def get(self):

return self._url.read()

python_org=Url('http://python.org')

print  python_org.headrs()

"""

还可以用于获取页面主体以更新本地拷贝之前,通过查看报头last-modifed来确定页面是否已经改变

如下:

"""

python1=Url('http://ubuntu.mirrors.proxad.net/hardy/ubuntu-8.04-desktop-i386.iso')

print python1.headrs['last-modified']#可能会报错

"""

代理的另一个使用场景就是数据唯一性;

例如:一但上在多个位置显示相同文档的网站,文档附加了专用每个位置额外字段,如访问计数和几个许可设置,代理可以用于这样的情况,由它处理与位置相关的事件,并且指向原始文档而不是复制它,所以,一个指定的文档可以拥有很多代理,如果它的内容变化。

所有位置都将从中获益而不必处理版本同步;

使用代理作为可能存在于其他地方的某些东西的本地句柄,可以:

使进程更快

避免外部资源访问

降低内存负载

确保数据唯一性

"""

#外观:提供对子系统的,更简单的访问

"""

它只是一个使用应用程序的某个功能的快捷方式,不需要对应子系统的底层复杂性,比如:可以通过包级提供更高的函数来完成。

外观模型通过在现有系统基础上使用,在这里,包的觉用法是将综合到高级别的函数中,一般不需要提供这样的模式

__init__.py模块中简单函数就可以了

外观简化包的用法,一般在几次有使用反馈的迭代之后加入

"""

#行为型模式  有助于对进程进行结构化的模式

##观察者(observer)

"""

用来通知一系列对象状态的变化。使用观察都模式可以在一个应用程序中以可插入的方式来添加特性,并且解除现有代码库和新功能之间的耦合。

事件框架是观察者典型实现,如图,每当一个事件发生时,事件所有观察者都会得到触发此事件的对象通知。

事件是发生某些事件的时刻,在图形界面应用程序中,事件驱动编程(请看:http://en.wikipedia.org/wiki/eventdriven_programming)

常常被用来实现代码到用户操作的链接,比如,一个函数可以链接到mousemove事件上,这样每当鼠标移动到窗口上面上,这个函数将被调用,

在这样的情况下,将这些代码从窗口管理事件中耦合,大大简化了工作:函数将单独编写,注册为事件观察者,如图:

这种方法从微软公司的mfc framework(http://en.wikipedia.org/wiki/microsoft_foundation_class_library)

起就存在于所有的gui开发工具(如delphi)中。

但是这些代码也可能生成事件,比如,在一个将文档存储到数据库应用程序中,代码可能提供

documentcreated,docmentmodified和documentdeleted3个事件

一个针对文档的新特性可以将其自身注册为一个观察者,系文件被创建,修改或者删除时就能得到通知,并且进行相应的工作,这样可以在一个文档索引程序,当然,这要求负责创建,修改或者删除文档的代码触发事件

但是这比在应用程序代码库中到处添加索引的钩子程序要容易的多。

在python可以使用event来实现上面所说的,如下:

"""

class Event(object):

_obj=[]

def __init__(self,obj1):

self.obj1=obj1

@classmethod

def reg(cls,objs):

if objs not in cls._obj:

cls._obj.append(objs)

@classmethod

def reg1(cls,objs):

if objs in cls._obj:

cls._obj.remove(objs)

@classmethod

def not1(cls,sub):

event=cls(sub)

for o in cls._obj:

o(event)

#思路是观察者使用event类方法注册自己,并用携带触发 这些事件的event来获得,如下:

class WritEvent(object):

def __repr__(self):

return 'WritEvent(self)'

def log(event):

print '%s :was writees '%event._obj

WritEvent.reg(log)

class Anot(object):

def __call__(self, e):

print'yean %s told me!'%e

WritEvent.reg(Anot)

WritEvent.not1('a given file')

#对这个实现,可以做以下改进:

"""

允许开发人员修改顺序

使事件对象保存比主题更加的信息

如果希望使用现有工具,可以使用pydispatch,它提供了一个很好的多消费者和多生产者的调度机制

(http://www.sqlobject.org/module-sqlobject.pydispatch.html)

"""

python高级编程:有用的设计模式2的更多相关文章

  1. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  2. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  3. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  4. python高级编程之选择好名称:完

    由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...

  5. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  6. python高级编程之列表推导式

    1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...

  7. Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

    原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...

  8. Python高级编程-Python一切皆对象

    Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...

  9. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

随机推荐

  1. Android中设置文本颜色的三种方法

    最近刚开始学web,发现好的颜色搭配可以让自己的网页更加美观, 中午不想做事,就无聊滴花了两个小时测试了所有颜色的编码,总结如下 新手没有什么吊炸天的技术,仅仅是一份辅助的文档,有兴趣的朋友可以收藏下 ...

  2. GitHub托管BootStrap资源汇总

    MESSENGER替换alert()消息和其他用户交互通知. JQUERY.TOCIFY.JS可以用Bootstrap或jQueryUI主题的Jquery表格组件. BOOTSTRAP-PROMPTS ...

  3. linux/unix运行级别

    在SYSTEM V 风格的UNIX系统中,系统被分为不同的运行级别,这和BSD分支的UNIX有所不同,常用的为0~6七个级别:0关机 1单用户 2不带网络的多用户 3带网络的多用户 4保留,用户可以自 ...

  4. 零基础学习云计算及大数据DBA集群架构师【Linux系统配置及网络配置2015年12月30日周三】

    /Mon *************摘要************** 计划任务 )一次性计划任务 服务:atd 命令:at 服务存放文件:/etc/init.d/atd 系统配置文件:/etc/at. ...

  5. AnkhSVN 中文版 支持VS2015

    简介:AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交,而且该插件属于开源项目. 这个版本是简体中文的重新编译版本 ...

  6. 国外.net学习资源网站

    转载 :出处:http://www.cnblogs.com/kingjiong/ 名称:快速入门地址 http://chs.gotdotnet.com/quickstart/ 描述:本站点是微软.NE ...

  7. (转)jQuery Validation Plugin客户端表单证验插件

    jQuery Validation Plugin客户端表单验证插件 官方文档:http://jqueryvalidation.org/documentation/ 官方demo:http://jque ...

  8. C#--virtual,abstract,override,new,sealed

    virtual:使用此关键字,可以使其在派生类中被重写. abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现. override: 重写父类方法,属性,或事件的抽象实现或虚 ...

  9. GitHub 相关内容

    1. Git是分布式版本控制系统 集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中 ...

  10. HDU 2063 裸奔的二分图最大匹配

    #include <cstdio>#include <cmath>#include <algorithm>#include <iostream>#inc ...