专栏名称: 隼与鱼
目录
相关文章推荐
51好读  ›  专栏  ›  隼与鱼

设计模式

隼与鱼  · 简书  ·  · 2019-03-31 14:30

正文

请到「今天看啥」查看全文


设计模式描述了软件设计过程中经常碰到的问题及解决方案,它是面向对象设计经验的总结和理论化抽象。通过设计模式,开发者就可以无数次地重用已有的解决方案,无需再重复相同的工作。本篇将简单介绍工厂模式与适配器模式。

工厂模式

工厂模式主要用来实例化有共同方法的类,它可以动态决定应该实例化哪一个类,不必事先知道每次要实例化哪一个类。例如在编写一个应用程序时,用户可能会连接各种各样的数据库,但开发者不能预知用户会使用哪个数据库,于是提供一个通用方法,里面包含了各个数据库的连接方案,用户在使用过程中,只需要传入数据库的名字并给出连接所需要的信息即可,如下所示。

 1  class Operation(object):
 2      def connect(self):
 3          pass
 4  class MySQL(Operation):
 5      def connect(self):
 6          print('连接MySQL成功')
 7  class SQLite(Operation):
 8      def connect(self):
 9          print('连接SQLite成功')
 10 class DB(object):
 11     @staticmethod
 12     def create(name):
 13         name = name.lower()
 14         if name == 'mysql':
 15             return MySQL()
 16         elif name == 'sqlite':
 17             return  SQLite()
 18         else:
 19             print('不支持其他数据库')
 20 if __name__ == '__main__':
 21     db1 = DB.create('MySQL')
 22     db1.connect()
 23     db2 = DB.create('SQLite')
 24     db2.connect()

运行结果如下图所示。


运行结果

在上例中,第10行定义DB类,类中定义了一个静态方法create (),该方法的参数为类名,可以根据类名创建对应的对象,因此称为工厂方法。从程序运行结果可看出,工厂方法可以根据类名创建相应的对象。

适配器模式

适配器模式是指一种接口适配技术,实现两个不兼容接口之间的兼容,例如原程序中存在类Instrument与Person,其中Instrument实例对象可以调用play()方法,Person实例对象可以调用act()方法,新程序中增加类Computer,其实例对象可以调用execute()方法,现要求类Instrument与Person的实例对象通过execute()调用各自的方法,具体如下所示。

 1  class Instrument(object):  # 乐器类,原程序存在的类
 2      def __init__(self, name):
 3          self.name = name
 4      def play(self):
 5          print(self.name, '演奏')
 6  
 7  class Person(object): # 人类,原程序存在的类
 8      def __init__(self, name):
 9          self.name = name
 10     def act(self):
 11         print(self.name, '表演')
 12 class Computer(object): # 计算机类,新程序添加的类
 13     def __init__(self, name):
 14         self.name = name
 15     def execute(self):
 16         print(self.name, '执行程序')
 17 class Adapter(object): # 适配器类,用于统一接口
 18     def __init__(self, obj, adaptedeMthods):
 19         self.obj = obj
 20         self.__dict__.update(adaptedeMthods)
 21 if __name__ == '__main__':
 22     obj1 = Instrument('guitar')
 23     Adapter(obj1, dict(execute = obj1.play)).execute()
 24     obj2 = Person('xiaoqian')
 25     Adapter(obj2, dict(execute = obj2.act)).execute()

运行结果如下图所示。


运行结果

在上例中,第17行定义适配器类,第20行使用类的内部字典 dict ,它的键是属性名,值是相应属性对象的数据值。第23、25行通过适配器类的实例对象实现了新程序与原程序的兼容。







请到「今天看啥」查看全文