专题12 常见的设计模式—python实现_python设计模式升级版

def \_\_init\_\_(self, name):
    print("Hello Miss." + name)

class Factory:
def getPerson(self, name, gender):
if gender == ‘M’:
return Male(name)

    if gender == 'F':
        return Female(name)

if name == ‘__main__’:
factory = Factory()
person = factory.getPerson(“Chetan”, “M”)


#### 构造者模式


将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现



Abstract Builder

class Builder(object):
def __init__(self):
self.building = None

def new\_building(self):
    self.building = Building()

Concrete Builder

class BuilderHouse(Builder):
def build_floor(self):
self.building.floor = ‘One’

def build\_size(self):
    self.building.size = 'Big'

class BuilderFlat(Builder):
def build_floor(self):
self.building.floor = ‘More than One’

def build\_size(self):
    self.building.size = 'Small'

Product

class Building(object):
def __init__(self):
self.floor = None
self.size = None

def \_\_repr\_\_(self):
    return 'Floor: %s | Size: %s' % (self.floor, self.size)

Director

class Director(object):
def __init__(self):
self.builder = None

def construct\_building(self):
    self.builder.new_building()
    self.builder.build_floor()
    self.builder.build_size()

def get\_building(self):
    return self.builder.building

Client

if name == “__main__”:
director = Director()
director.builder = BuilderHouse()
director.construct_building()
building = director.get_building()
print(building)

director.builder = BuilderFlat()
director.construct_building()
building = director.get_building()
print(building)

#### 原型模式


用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。  
 原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。


浅拷贝(Shallow Copy):指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝的对象和源对象只是名称相同,但是他们共用一个实体。  
 深拷贝(deep copy):对对象实例中字段引用的对象也进行拷贝。



import copy
from collections import OrderedDict

class Book:
def __init__(self, name, authors, price, **rest):
‘’‘rest的例子有:出版商、长度、标签、出版日期’‘’
self.name = name
self.authors = authors
self.price = price # 单位为美元
self.dict.update(rest)

def \_\_str\_\_(self):
    mylist = []
    ordered = OrderedDict(sorted(self.__dict__.items()))
    for i in ordered.keys():
        mylist.append('{}: {}'.format(i, ordered[i]))
        if i == 'price':
            mylist.append('$')
        mylist.append('\n')
        return ''.join(mylist)

class Prototype:
def __init__(self):
self.objects = dict()

def register(self, identifier, obj):
    self.objects[identifier] = obj

def unregister(self, identifier):
    del self.objects[identifier]

def clone(self, identifier, \*\*attr):
    found = self.objects.get(identifier)
    if not found:
        raise ValueError('Incorrect object identifier: {}'.format(identifier))
    obj = copy.deepcopy(found)
    obj.__dict__.update(attr)
    return obj

def main():
b1 = Book(‘The C Programming Language’, (‘Brian W. Kernighan’, ‘Dennis M.Ritchie’),
price=118, publisher=‘Prentice Hall’, length=228, publication_date=‘1978-02-22’,
tags=(‘C’, ‘programming’, ‘algorithms’, ‘data structures’))
prototype = Prototype()
cid = ‘k&r-first’
prototype.register(cid, b1)
b2 = prototype.clone(cid, name=‘The C Programming Language(ANSI)’, price=48.99,
length=274, publication_date=‘1988-04-01’, edition=2)
for i in (b1, b2):
print(i)
print(“ID b1 : {} != ID b2 : {}”.format(id(b1), id(b2)))

if name == ‘__main__’:
main()


### 结构型模式


#### 适配器模式


所谓适配器模式是指是一种接口适配技术,它可通过某个类来使用另一个接口与之不兼容的类,运用此模式,两个类的接口都无需改动。


适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如在需要对早期代码复用一些功能等应用上很有实际价值。


解释二:  
 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口.Adapter Pattern使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.  
 应用场景:系统数据和行为都正确,但接口不符合时,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但接口又与复用环境不一致的情况



class Target(object):
def request(self):
print(“普通请求”)

class Adaptee(object):

def specific\_request(self):
    print("特殊请求")

class Adapter(Target):

def \_\_init\_\_(self):
    self.adaptee = Adaptee()

def request(self):
    self.adaptee.specific_request()

if name == “__main__”:
target = Adapter()
target.request()


#### 装饰器模式


该模式虽名为修饰器,但这并不意味着它应该只用于让产品看起来更漂亮。修饰器模式通常用于扩展一个对象的功能。这类扩展的实际例子有,给枪加一个消音器、使用不同的照相机镜头



import functools

def memoize(fn):
known = dict()

@functools.wraps(fn)
def memoizer(\*args):
    if args not in known:
        known[args] = fn(\*args)
    return known[args]

return memoizer

@memoize
def nsum(n):
‘’‘返回前n个数字的和’‘’
assert (n >= 0), ‘n must be >= 0’
return 0 if n == 0 else n + nsum(n - 1)

@memoize
def fibonacci(n):
‘’‘返回斐波那契数列的第n个数’‘’
assert (n >= 0), ‘n must be >= 0’
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)

if name == ‘__main__’:
from timeit import Timer

measure = [{'exec': 'fibonacci(100)', 'import': 'fibonacci', 'func': fibonacci},
           {'exec': 'nsum(200)', 'import': 'nsum', 'func': nsum}]
for m in measure:
    t = Timer('{}'.format(m['exec']), 'from \_\_main\_\_ import{}'.format(m['import']))
    print('name: {}, doc: {}, executing: {}, time:{}'.format(m['func'].__name__,
                                                             m['func'].__doc__, m['exec'],
                                                             t.timeit()))

#### 外观模式


外观模式又叫做门面模式。在面向对象程序设计中,解耦是一种推崇的理念。但事实上由于某些系统中过于复杂,从而增加了客户端与子系统之间的耦合度。例如:在家观看多媒体影院时,更希望按下一个按钮就能实现影碟机,电视,音响的协同工作,而不是说每个机器都要操作一遍。这种情况下可以采用外观模式,即引入一个类对子系统进行包装,让客户端与其进行交互。


外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。


#### 享元模式


#### 模型-视图-控制器模式


#### 代理模式


### 行为型模式


#### 责任链模式


#### 命令模式


#### 解释器模式


#### 观察者模式




做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。



别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。

* * *



**(1)Python所有方向的学习路线(新版)**

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



最近我才对这些路线做了一下新的更新,知识体系更全面了。



![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)



**(2)Python学习视频**



包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。



![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)



**(3)100多个练手项目**

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。



![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)



**(4)200多本电子书**  

  

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。



基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。



**(5)Python知识点汇总**

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。



![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)



**(6)其他资料**



还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。



![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)

**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

你可能感兴趣的:(程序员,设计模式,python,开发语言)