《大话设计模式》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()

七、模板方法模式

 

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

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

代码特点:无






 
 
 
 
目录
相关文章
|
6天前
|
监控 Python
Python中的装饰器:提升代码灵活性与可读性
在Python编程中,装饰器是一种强大的工具,能够提升代码的灵活性和可读性。本文将介绍装饰器的基本概念、使用方法以及实际应用场景,帮助读者更好地理解和利用这一功能。
|
8天前
|
人工智能 数据可视化 数据挖掘
【python】Python航空公司客户价值数据分析(代码+论文)【独一无二】
【python】Python航空公司客户价值数据分析(代码+论文)【独一无二】
|
14天前
|
数据采集 JSON 数据可视化
【python】python懂车帝数据可视化(代码+报告)
【python】python懂车帝数据可视化(代码+报告)
|
13天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
7天前
|
缓存 监控 算法
优化Python代码性能的10个技巧
提高Python代码性能是每个开发者都需要关注的重要问题。本文将介绍10个实用的技巧,帮助你优化Python代码,提升程序的运行效率和性能表现。无论是避免内存泄漏、减少函数调用次数,还是使用适当的数据结构,都能在不同场景下发挥作用,使你的Python应用更加高效稳定。
|
1天前
|
缓存 算法 Python
优化Python代码的十大技巧
本文介绍了十种优化Python代码的技巧,涵盖了从代码结构到性能调优的方方面面。通过学习和应用这些技巧,你可以提高Python程序的执行效率,提升代码质量,以及更好地应对复杂的编程任务。
|
1天前
|
程序员 Python
Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以在不修改原始代码的情况下,动态地添加功能。本文将深入探讨Python中装饰器的原理、用法和实际应用,以及如何利用装饰器提升代码的可读性和灵活性。
|
3天前
|
缓存 开发者 Python
深入探讨Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以在不修改原始函数代码的情况下,对其行为进行扩展或修改。本文将深入探讨装饰器的原理和用法,以及如何利用装饰器提升代码的可读性和灵活性,为Python开发者提供更加优雅和高效的编程方式。
|
8天前
|
机器学习/深度学习 数据可视化 算法
【python】Python大豆特征数据分析 [机器学习版一](代码+论文)【独一无二】
【python】Python大豆特征数据分析 [机器学习版一](代码+论文)【独一无二】
|
8天前
|
机器学习/深度学习 数据可视化 数据挖掘
【python】双十一美妆数据分析可视化 [聚类分析/线性回归/支持向量机](代码+报告)【独一无二】
【python】双十一美妆数据分析可视化 [聚类分析/线性回归/支持向量机](代码+报告)【独一无二】