模拟适配模式代码

  1. class SocketEntity:
  2. """接口类型定义"""
  3. def __init__(self, num_of_pin, type_of_pin):
  4. # 引脚数
  5. self.__num_of_pin = num_of_pin
  6. # 引脚类型
  7. self.__type_of_pin = type_of_pin
  8. def get_num_of_pin(self):
  9. return self.__num_of_pin
  10. def set_num_of_pin(self, num_of_pin):
  11. self.__num_of_pin = num_of_pin
  12. def get_type_of_pin(self):
  13. return self.__type_of_pin
  14. def set_type_of_pin(self, type_of_pin):
  15. self.__type_of_pin = type_of_pin
  16. class ISocket:
  17. """插座类型"""
  18. def get_name(self):
  19. """插座名称"""
  20. pass
  21. def get_socket(self):
  22. """获取接口"""
  23. pass
  24. class ChineseSocket(ISocket):
  25. """国标插座"""
  26. def get_name(self):
  27. return '国标插座'
  28. def get_socket(self):
  29. return SocketEntity(3, '八字扁型')
  30. class BritishSocket(object):
  31. """英标插座"""
  32. def name(self):
  33. return '英标插座'
  34. def socket_inter_face(self):
  35. return SocketEntity(3, 'T字方型')
  36. class AdapterSocket(ISocket):
  37. """插座转换器"""
  38. def __init__(self, britishSocket):
  39. self.__britishSocket = britishSocket
  40. def get_name(self):
  41. return self.__britishSocket.name() + '转换器'
  42. def get_socket(self):
  43. socket = self.__britishSocket.socket_inter_face()
  44. socket.set_type_of_pin('八字扁型')
  45. return socket
  46. def can_charge_for_digtal_device(name, socket):
  47. if socket.get_num_of_pin() == 3 and socket.get_type_of_pin() == '八字扁型':
  48. is_standard = '符合'
  49. can_charge = '可以'
  50. else:
  51. is_standard = '不符合'
  52. can_charge = '不可以'
  53. print("[%s]: \n针脚数量:%s, 针脚类型:%s:%s中国标准,%s给中国内地的电子设备充电!" % (
  54. name, socket.get_num_of_pin(), socket.get_type_of_pin(), is_standard, can_charge
  55. ))
  56. def test_socket():
  57. chinese_socket = ChineseSocket()
  58. can_charge_for_digtal_device(chinese_socket.get_name(), chinese_socket.get_socket())
  59. british_socket = BritishSocket()
  60. can_charge_for_digtal_device(british_socket.name(), british_socket.socket_inter_face())
  61. adapter_socket = AdapterSocket(british_socket)
  62. can_charge_for_digtal_device(adapter_socket.get_name(), adapter_socket.get_socket())
  63. if __name__ == '__main__':
  64. test_socket()

什么是适配模式

将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两类能够在一起工作。
适配模式的作用:

  • 接口转换,将原有的接口(或方法)转换成另一种接口。
  • 用新的接口包装一个已有的类。
  • 匹配一个老组件到一个新的接口。

    适配模式设计思想

    适配模式又称变压器模式,也叫包装模式,它的核心思想是:将一个对象经过包装或转换后使它符合指定的接口,使得调用方法可以像使用接口的一般对象一样使用它。

    代码框架

    ```python class Target: “””目标类”””

    def function(self):

    1. pass

class Adaptee: “””源对象类”””

  1. def speciafic_function(self):
  2. print('被适配对象的特殊方法')

class Adapter(Adaptee, Target): “””适配器”””

  1. def function(self):
  2. print('进行功能转换')

``` 适配模式的实现有两种方试:一种是组合方式,一种是继承方式。
Targe是一个类的接口,是提供给用户调用的接口对象,如故事剧情种ISocket。Adaptee是要进行适配的对象类,如故事剧情种的BritishSocket的name()和socketInterface()方法包装成ISocket的get_name()和get_socket()接口。
适配模式的两种方式,我比较推荐组合的方式,因为在一些没有interface类型的编程语言中,Adapter类就会多继承,同时继承Target和Adaptee,在程序设计中尽量避免多继承。

适配模式要点

适配模式中主要有三个角色,在设计适配模式时要找到并区分这些角色。

  • 目标(Target): 即你期望的目标接口,要转换成的接口
  • 源对象(Adaptee): 即要被转换的角色,要把谁转换成目标角色。
  • 适配器(Adapter): 适配模式的核心角色,负责把源对象转换和包装成目标对象。

    适配模式优缺点

    优点:

    1. - 可以让两个没有关联的类一起运行,起中间转换的作用。
    2. - 提高类的复用率。
    3. - 灵活性好,不会破坏原有系统。

    缺点:

    1. - 如果原有系统没有设计好(如Target不是抽象类或接口,而是一个实体类),适配模式将很实现。
    2. - 过多地使用适配器,容易使代码结构混乱,如明明看到调用地是A接口,内部调用对的却是B接口的实现。

    实战