微信公众号: 人人都能python编程 ,欢迎分享,非公众号转载保留此声明。
上篇文章《知道这几个设计模式,吊打80%程序员》讲了4个基础的模式,但是即使只掌握这4个模式,并且进行刻意练习,也足以胜任60%的日常编码需求。不过在这篇文章和接下来的几篇文章里,我打算再介绍几个设计模式,这样足以让你可以打败80%的程序员。后面也有计划会把有名的开源项目里用到的设计模式拆解给大家看,目标是遇到真正业务问题需要用设计模式进行抽象的时候做到胸有成竹。 还是按照武功秘籍来类比,这篇文章讲到的两个招式为:
第五式:潜龙勿用 - 构建器模式
第六式:利涉大川 - 代理模式
潜龙勿用 - 构建器模式
什么是构建器模式?其实构建器是一种创建模式。 构建器通过小而简单的步骤构建复杂的对象。例如,有创建两个或三个对象的通用步骤。
为什么需要构建模式呢?因为相同的构建过程都可以创建复杂的对象。 构建器使代码更有可重用和解耦。 什么时候才用构建器模式呢?我们举2个生活中的例子:
在餐厅里,厨房里有很小且常见的步骤,以准备食物包装。例如,食物可以是汉堡作为肉或鸡肉。饮料可以是可乐或百事可乐。遵循这些步骤可能会导致我们创建一顿复杂的饭菜。但是这些步骤其实是非常复杂的,需要一定的领域专业度才能创建。 另外一个拿一个工资计算作为例子,计算员工和经理的工资有共同的步骤和相似之处。例如,两者都有福利和净工资。但无论过程怎样,他们的结果就是计算工资。
以计算工资这个老掉牙的案例为例,可以画出他的UML对象结构图
根据上面的图,用纯Python模拟一下,分别创建Salary和SalaryBuilder类
class Salary(object):
class SalaryBuilder(object):
def __init__(self):
self.extra = False
self.benefit = False
def add_benefit(self):
self.benefit = True
return self
def add_extra(self):
self.extra = True
return self
def build(self):
return Salary(self)
def __init__(self, builder):
self.benefit = builder.benefit
self.extra = builder.extra
def main():
print( “Building a Salary…”)
salary = Salary.SalaryBuilder().add_benefit().add_extra().build()
if salary.benefit:
print( “The Salary has benefit.”)
if salary.extra:
print( “The Salary has extra.”)if __name__ == “__main__”:
main()
利涉大川 - 代理模式
什么是代理模式?代理设计模式是一种结构模式,试图保护部分代码免受客户端的影响。代理代表真正的类来做它,所谓的它是类的委托来表示对象并保护和控制对对象的访问,主要因为如下几个目的:
1.访问控制:当对象敏感被泄露时。
2.延迟初始化::当访问对象是昂贵的,因为它获得了太多的沉重资源,我们更愿意在我们真正需要它们时加载它们。
- 远程:当对象位于远程而本地不可用时。
5.缓存和记录请求:代理类可以注册和保存来自客户端的每个请求并保留它们。 Proxy可以缓存重复的数据请求,降低数据库开销。
- 检查资源:代理可以智能地检查客户端是否到达所需的资源,如果客户端不活动,则代理处理资源。
同样,再什么情况下需要用到这个模式呢?我们举出2个例子来加深印象, 1.当有一个或多个类别时,必须覆盖和保护以显示给客户。 2.有一个或多个类,它们使用大部分内存并且非常昂贵,因此必须在它们的存在非常关键时对其进行初始化,而不仅仅是对任何请求。
不要看描述比较拗口,但是实际两个对象的关系其实非常简单,我们在这里也可以用UML对象图来画一下,这样比较清楚。
其实这个模式我的理解是,对于真正的代理对象有更多的控制,在这个过程中可以插入我们自己的代码,这个模式再实际中用得比较多,大家务必仔细领会! 同样,我们用一段简单的Python代码来表示一下对象的关系!
class Entity(object):
def __init__(self, *args, **kw):
pass
def show(self, name):
pass
#Real
class RealEntity(Entity):
def __init__(self, *args, **kw):
Entity.__init__(self, *args, **kw)
def show(self):
print(self.name)
#Proxy
class ProxyEntity(Entity):
def __init__(self, *args, **kw):
Entity.__init__(self, *args, **kw)
self.protectedEntities = []
self.protectedEntities.append("Class_A")
self.protectedEntities.append("Class_H")
self.protectedEntities.append("Class_G")
self.protectedEntities.append("Class_P")
def show(self, name):
if self.protectedEntities.__contains__(name):
print("Access is Denied")
entity = Entity ()
entity.show(name)
总结
今天这篇文章主要介绍了两个招式,构建器和代理模式。说实话,这两个模式用的都比较多,特别是第二个,可以同时代理多个对象,威力巨大。再说点题外话,有读者反映上篇文章包含的模式太多了,不太好消化,所以这篇文章我只包含了2个模式,拆成几篇文章来讲,希望大家理解和喜欢。