欢迎来到天天文库
浏览记录
ID:5188090
大小:29.00 KB
页数:7页
时间:2017-12-05
《基于python设计模式探究》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于Python设计模式探究 摘要:在面向对象的软件设计过程中,为了提升软件的复用性、灵活性、扩展性、可维护性、稳定性,程序员通过封装、继承、派生等手段对软件架构有目的性的进行了一些额外设计。在编码之初,可能觉得有无这些设计并不重要,但是随着软件的需求的变化以及功能的扩展,在后续软件的更改与维护过程中就会越发体现出这些设计工作必要性。以往,这些设计工作都是由有经验的程序员实施的,随着设计模式的成熟和增多,逐渐对这些设计模式进行了归纳与提取,并总结出了各种经典的设计模式供程序员学习与效仿。【关键词】设计模式Python工厂模式策略模式Python是一种流行的动态脚本语言
2、,具有语法简捷清晰、跨平台、编码效率高、可维护性强等特点。Python经历了十多年的发展,目前已相当成熟。Python拥有许多C/C++所不具备的优势,比如:编码效率,代码的规范性、可读性,丰富的内置数据类型、跨平台等,但最重要的一点是,Python同样支持面向对象,具有继承、派生等特性。本文通过实际事例对各种常见的设计模式及设计原则进行讲解,在体现设计模式必要性的同时也对python语言的进行了展示,为python程序员和爱好者提供了参考与借鉴。71设计模式1.1工厂模式工厂模式指的是一个工厂对象决定创建出那一种具体的类对象。工厂模式由3个部分组成:工厂对象、抽象产品
3、对象以及具体产品对象,工厂模式如所示。工厂模式通过抽象出的产品对象,减少了代码的耦合。工厂模式如图1所示。1.2策略模式策略模式是将一系列算法进行封装,对外提供统一的调用接口。策略模式中的各种算法虽然实现不同,但都以相同方式调用。策略模式减少了算法之间的耦合。策略模式如图2所示。2实现及优化2.1原始设计某公司需要对员工考勤记录进行统计。考勤记录为打卡机生成的excel表。根据需求可以很容易的想到要设计2个类来实现上述功能:一个为操作excel的类(ExcelClass类),另一个则是用于统计各种考勤信息的类(OverTime类)。程序结构大致可以表述如下:m_Over
4、Timer=OverTime()myExcel=ExcelClass(“考勤记录.xls”)m_AllRecords=myExcel.getallRecord7result=m_OverTimer.Process(m_AllRecords)2.2简单工厂模式接近年终,公司领导为完成年度任务,要求部分员工实行611工作制,并严格考勤,于是考勤软件需要实现对611员工迟到、早退、旷工的特殊处理。首先肯定会想到的是要对OverTime进行派生,派生出对普通员工统计的子类(OverTimeNormal)和对611制员工统计的子类(OverTime611)对Process函数进行
5、考勤处理。然后在业务代码中对员工姓名进行判断,如果属于611工作制的员工,则生成OverTime611类对象进行处理,反之则生成OverTimeNormal对象进行处理。程序大致可以表述如下:myExcel=ExcelClass(“考勤记录.xls”)m_AllRecords=myExcel.getallRecordif(m_AllRecords.namein611NameList):m_OverTimer=OverTime611result=m_OverTimer.Process(m_AllRecords)else:m_OverTimer=OverTimeNormal
6、result=m_OverTimer.Process(m_AllRecords)7这样虽然可以达到目的,但是如果再派生出其他之类(如724工作制),那么不仅需要对派生类进行编写,还需要改动业务代码。这无疑增加了程序的耦合性。于是可以考虑采用工厂模式。定义了一个工厂函数类,它依据员工姓名生成对应的m_OverTimer.对象,不同对象调用子类重载的Process函数对考勤时间进行计算。工厂类表述如下:classfactory():def__init__(self,name):if(namein611NameList):self.m_OverTimer=OverTime61
7、1else:self.m_OverTimer=OverTimeNormal业务代码大致可以表述如下:myExcel=ExcelClass(“考勤记录.xls”)m_AllRecords=myExcel.getallRecordm_factory=factory(m_AllRecords.name)result=m_factory.Process(m_AllRecords)但是存在一个问题,就是所有子类对象必须有同样的方法名称,要是不同对象之间不是从同一个父类派生而来,那方法的名称也可能不同,这样就没法使用工厂模式了。策略模式可以解决这个问
此文档下载收益归作者所有