《大话设计模式》Python版代码实现

简介: 来源:http://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html 一、简单工厂模式 模式特点:工厂根据条件产生不同功能的类。 程序实例:四则运算计算器,根据用户的输入产生相应的运算类,用这个运算类处理具体的运算。 代码特点:C/C++中的switch...case...分支使用字典的方式代替。  

来源:http://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html

一、简单工厂模式

模式特点:工厂根据条件产生不同功能的类。

程序实例:四则运算计算器,根据用户的输入产生相应的运算类,用这个运算类处理具体的运算。

代码特点:C/C++中的switch...case...分支使用字典的方式代替。

     使用异常机制对除数为0的情况进行处理。

class Operation(object):
    def get_result(self):
        pass


class Add(Operation):
    def get_result(self):
        return self.op1+self.op2


class Sub(Operation):
    def get_result(self):
        return self.op1 - self.op2


class Mul(Operation):
    def get_result(self):
        return self.op1 * self.op2


class Div(Operation):
    def get_result(self):
        return self.op1 / self.op2


class Undef(Operation):
    def get_result(self):
        print "no define operator"


class Factory(object):
    operator = dict()
    operator["+"] = Add()
    operator["-"] = Sub()
    operator["*"] = Mul()
    operator["/"] = Div()

    def create_operator(self, ch):
        op = self.operator[ch] if ch in self.operator else Undef()
        return op


def main():
    print "*" * 30
    op = raw_input("operator:")
    opa = input("a:")
    opb = input("b:")
    factory = Factory()
    cal = factory.create_operator(op)
    cal.op1 = opa 
    cal.op2 = opb
    print cal.get_result()


if __name__ == "__main__":
    while 1:
        main()
    pass

二、策略模式

模式特点:定义算法家族并且分别封装,它们之间可以相互替换而不影响客户端。

程序实例:商场收银软件,需要根据不同的销售策略方式进行收费

代码特点:不同于同例1,这里使用字典是为了避免关键字不在字典导致bug的陷阱。

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

import os


class CashSuper(object):
    def accept_cash(self, money):
        return 0


class CashNormal(CashSuper):
    def accept_cash(self, money):
        return money


class CashRebate(CashSuper):
    discount = 0

    def __init__(self, ds):
        self.discount = ds

    def accept_cash(self, money):
        return money * self.discount


class CashReturn(CashSuper):
    total = 0
    ret = 0

    def __init__(self, total, ret):
        self.total = total
        self.ret = ret

    def accept_cash(self, money):
        if money >= self.total:
            return money - self.ret
        else:
            return money


class CashContext:
    def __init__(self, child_class):
        self.cs = child_class

    def get_result(self, money):
        return self.cs.accept_cash(money)


def main():
    print "*" * 30
    money = input("money:")
    strategy = dict()
    strategy[1] = CashContext(CashNormal())
    strategy[2] = CashContext(CashRebate(0.8))
    strategy[3] = CashContext(CashReturn(300, 100))
    ctype = input("type:[1]for normal,[2]for 80% discount [3]for 300 -100.")
    if ctype in strategy:
        cc = strategy[ctype]
    else:
        print "no define type. Use normal mode."
        cc = strategy[1]
    print "you will pay:%d" % (cc.GetResult(money))


if __name__ == "__main__":
    main()

三、装饰模式

模式特点:动态地为对象增加额外的职责

程序实例:展示一个人一件一件穿衣服的过程。

代码特点:无

class Person(object):
    def __init__(self, name):
        self.name = name

    def show(self):
        print "dressed %s" % self.name


class Finery(Person):
    component = None

    def __init__(self):
        super(Finery, self).__init__("")
        pass

    def decorate(self, ct):
        self.component = ct

    def show(self):
        if self.component is not None:
            self.component.show()


class TShirts(Finery):
    def __init__(self):
        super(TShirts, self).__init__()
        pass

    def show(self):
        print "Big T-shirt "
        self.component.show()


class BigTrouser(Finery):
    def __init__(self):
        super(BigTrouser, self).__init__()
        pass

    def show(self):
        print "Big Trouser "
        self.component.show()


def main():
    p = Person("somebody")
    bt = BigTrouser()
    ts = TShirts()
    bt.decorate(p)
    ts.decorate(bt)
    ts.show()


if __name__ == "__main__":
    main()

四、代理模式

模式特点:为其他对象提供一种代理以控制对这个对象的访问。

程序实例:同模式特点描述。

代码特点:无

class Interface(object):
    def request(self):
        return 0


class RealSubject(Interface):
    def request(self):
        print "Real request."


class Proxy(Interface):
    def request(self):
        self.real = RealSubject()
        self.real.request()


def main():
    p = Proxy()
    p.request()


if __name__ == "__main__":
    main()

五、工厂方法模式

模式特点:定义一个用于创建对象的接口,让子类决定实例化哪一个类。这使得一个类的实例化延迟到其子类。

程序实例:基类雷锋类,派生出学生类和志愿者类,由这两种子类完成“学雷锋”工作。子类的创建由雷锋工厂的对应的子类完成。

代码特点:无

class LeiFeng(object):
    def Sweep(self):
        print "LeiFeng sweep"


class Student(LeiFeng):
    def Sweep(self):
        print "Student sweep"


class Volenter(LeiFeng):
    def Sweep(self):
        print "Volenter sweep"


class LeiFengFactory:
    def CreateLeiFeng(self):
        temp = LeiFeng()
        return temp


class StudentFactory(LeiFengFactory):
    def CreateLeiFeng(self):
        temp = Student()
        return temp


class VolenterFactory(LeiFengFactory):
    def CreateLeiFeng(self):
        temp = Volenter()
        return temp


def main():
    sf = StudentFactory()
    s = sf.CreateLeiFeng()
    s.Sweep()
    sdf = VolenterFactory()
    sd = sdf.CreateLeiFeng()
    sd.Sweep()


if __name__ == "__main__":
    main()

六、原型模式

模式特点:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

程序实例:从简历原型,生成新的简历

代码特点:简历类Resume提供的Clone()方法其实并不是真正的Clone,只是为已存在对象增加了一次引用。

     Python为对象提供的copy模块中的copy方法和deepcopy方法已经实现了原型模式,但由于例子的层次较浅,二者看不出区别。

import copy
class WorkExp:
    place=""
    year=0

class Resume:
    name = ''
    age = 0
    def __init__(self,n):
        self.name = n
    def SetAge(self,a):
        self.age = a
    def SetWorkExp(self,p,y):
        self.place = p
        self.year = y
    def Display(self):
        print self.age
        print self.place
        print self.year
    def Clone(self):
    #实际不是“克隆”,只是返回了自身
        return self
   

def main():
    a = Resume("a")
    b = a.Clone()
    c = copy.copy(a)
    d = copy.deepcopy(a)
    a.SetAge(7)
    b.SetAge(12)
    c.SetAge(15)
    d.SetAge(18)
    a.SetWorkExp("PrimarySchool", 1996)
    b.SetWorkExp("MidSchool", 2001)
    c.SetWorkExp("HighSchool", 2004)
    d.SetWorkExp("University", 2007)
    a.Display()
    b.Display()
    c.Display()
    d.Display()


if __name__ == "__main__":
    main()

七、模板方法模式

 

模式特点:定义一个操作中的算法骨架,将一些步骤延迟至子类中。

程序实例:考试时使用同一种考卷(父类),不同学生上交自己填写的试卷(子类方法的实现)

代码特点:无










   
目录
相关文章
|
22天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品消费模式分析的深度学习模型
使用Python实现智能食品消费模式分析的深度学习模型
116 70
|
23天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
31 6
|
1月前
|
存储 缓存 测试技术
Python中的装饰器:功能增强与代码复用的利器
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者以简洁优雅的方式增强函数或方法的功能。本文将深入探讨装饰器的定义、工作原理、应用场景以及如何自定义装饰器。通过实例演示,我们将展示装饰器如何在不修改原有代码的基础上添加新的行为,从而提高代码的可读性、可维护性和复用性。此外,我们还将讨论装饰器在实际应用中的一些最佳实践和潜在陷阱。
|
1月前
|
人工智能 数据挖掘 Python
Python编程基础:从零开始的代码旅程
【10月更文挑战第41天】在这篇文章中,我们将一起探索Python编程的世界。无论你是编程新手还是希望复习基础知识,本文都将是你的理想之选。我们将从最基础的语法讲起,逐步深入到更复杂的主题。文章将通过实例和练习,让你在实践中学习和理解Python编程。让我们一起开启这段代码之旅吧!
|
16天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
59 8
|
15天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
42 2
|
24天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
46 11
|
25天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
35 11
|
21天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
22天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
45 6