回眸一笑
开学啦开学啦,刚才路过食堂,发现隔壁一栋的学妹好漂亮啊,很想找个理由搭讪一下,直接问人家要不要学Python好像有点直接啊。看到宿舍旁边的快递很多,有的时候不太方便拿快递,于是我打算写个代码来教学妹帮我拿快递。
用Python来写设计模式会比Java,C++简洁很多,为啥呢~~还不是因为写Python速度快,语言简洁嘛。人生苦短,我用Python!正好设计模式里面有一种非常简洁的模式,叫代理模式。
先来一段理论介绍,喝两口水润润嗓子~~
代理模式,顾名思义就是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。它是一种对象结构型模式。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。
打个比方,我现在从京东买了一个鞋子,这个鞋子寄到学校了,然后呢我希望找一个代理帮我去拿。让学妹帮忙拿一下,有点鸡贼吧。
代理模式有三个关键要素,它们分别是:
主题(Subject):定义“操作/活动/任务”的接口类;
真实主题(RealSubject):真正完成“操作/活动/任务”的具体类;
代理主题(ProxySubject):代替真实主题完成“操作/活动/任务”的代理类;
下面是一个比较通用的框架:
1).首先抽象出一个通用的主题
比如我们有一个Subject类,然后里面有一个todo任务函数
2).接着抽象出两个主题
这两个主题都是通用主题的子类;
然后一个是真正的主题,另一个是代理的主题;
真正的主题我们先假定里面就一个干活的函数todo();
而代理的主题干了很多事情,有一个干活前的准备铺垫beforeRequest(),还有一个打完收工的afterRequest(),然后代理主题类里面的todo就是真的干代理的活,如果realSubject有值,就去调用真正主题里面的todo即可。
3).客户调用的类
上面的框架都搭建好了之后就可以让客户调用,怎么调用呢,就是设计一个client的函数包裹一下即可。
讲了这么多理论和代码,是不是还有点迷糊,确实设计模型招式都很精妙的,需要有一些通俗易懂的例子来诠释。下面终于到了精彩的地方,我们设计一个模式让学妹帮我们拿快递吧。
1).先设计一个包裹的类
抽象设计一个包裹的基类,有快递收件人的名字,快递地址和包裹的东西。
2).接着设计一个收件人的类
这个是真正的包裹要收件人的类,继承了包裹的基类之后,还有一个电话号码和收件的处理。
3).代收包裹的小妹上场
这个是代理人的类,也是继承了包裹的基类,然后在接受包裹前的行为用beforeReceive()处理,接受后会用函数afterReceive()来处理, receive就干代理的事情。
4.最后看一下效果
我是老王的朋友,我来帮他收快递
这个包裹的地址:复旦-计算机系-18级,收件人是:老王,手机:18151815xxx
接受到一个包裹:鞋子
代收人:学妹丽丽
我是老王的朋友,我来帮他收快递
这个包裹的地址:复旦-计算机系-18级,收件人是:老王,手机:18151815xxx
接受到一个包裹:书架
代收人:学妹婷婷
怎么样这个代理模式是不是很简单,容易理解,5分钟就就可以学会!一般我们在真实的项目里面用代理模式主要是想隐藏不希望被客户端看到的内容和服务,或者添加客户需要的额外服务,比如银行的交易里面大量用这样的模式。
辛苦码了代码半天,哎理想很丰满,现实很骨干,就怕学妹不愿意帮我收快递哦,要不下次约学妹恰饭吧。
近期热门:
还在做重复的劳动,不如用Python自动生成Excel以邮件发送
独家秘籍,50行代码教你买哪只黄金股
简单几步,100行代码用Python画一个蝙蝠侠的logo
N年Python老司机,血泪总结新手常见10大错误
学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃!
由 菜鸟学Python 原班人马打造的公众号:程序员GitHub,现已正式上线! 接下来我们将会在该公众号上,为大家分享GitHub上优质的开源神器,程序员圈的趣事,坚持每天一篇原创文章的输出,感兴趣的小伙伴可以关注一下哈!点击阅读原文,领取新手福利