模拟适配模式代码
class SocketEntity:
"""接口类型定义"""
def __init__(self, num_of_pin, type_of_pin):
# 引脚数
self.__num_of_pin = num_of_pin
# 引脚类型
self.__type_of_pin = type_of_pin
def get_num_of_pin(self):
return self.__num_of_pin
def set_num_of_pin(self, num_of_pin):
self.__num_of_pin = num_of_pin
def get_type_of_pin(self):
return self.__type_of_pin
def set_type_of_pin(self, type_of_pin):
self.__type_of_pin = type_of_pin
class ISocket:
"""插座类型"""
def get_name(self):
"""插座名称"""
pass
def get_socket(self):
"""获取接口"""
pass
class ChineseSocket(ISocket):
"""国标插座"""
def get_name(self):
return '国标插座'
def get_socket(self):
return SocketEntity(3, '八字扁型')
class BritishSocket(object):
"""英标插座"""
def name(self):
return '英标插座'
def socket_inter_face(self):
return SocketEntity(3, 'T字方型')
class AdapterSocket(ISocket):
"""插座转换器"""
def __init__(self, britishSocket):
self.__britishSocket = britishSocket
def get_name(self):
return self.__britishSocket.name() + '转换器'
def get_socket(self):
socket = self.__britishSocket.socket_inter_face()
socket.set_type_of_pin('八字扁型')
return socket
def can_charge_for_digtal_device(name, socket):
if socket.get_num_of_pin() == 3 and socket.get_type_of_pin() == '八字扁型':
is_standard = '符合'
can_charge = '可以'
else:
is_standard = '不符合'
can_charge = '不可以'
print("[%s]: \n针脚数量:%s, 针脚类型:%s:%s中国标准,%s给中国内地的电子设备充电!" % (
name, socket.get_num_of_pin(), socket.get_type_of_pin(), is_standard, can_charge
))
def test_socket():
chinese_socket = ChineseSocket()
can_charge_for_digtal_device(chinese_socket.get_name(), chinese_socket.get_socket())
british_socket = BritishSocket()
can_charge_for_digtal_device(british_socket.name(), british_socket.socket_inter_face())
adapter_socket = AdapterSocket(british_socket)
can_charge_for_digtal_device(adapter_socket.get_name(), adapter_socket.get_socket())
if __name__ == '__main__':
test_socket()
什么是适配模式
将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两类能够在一起工作。
适配模式的作用:
- 接口转换,将原有的接口(或方法)转换成另一种接口。
- 用新的接口包装一个已有的类。
-
适配模式设计思想
适配模式又称变压器模式,也叫包装模式,它的核心思想是:将一个对象经过包装或转换后使它符合指定的接口,使得调用方法可以像使用接口的一般对象一样使用它。
代码框架
```python class Target: “””目标类”””
def function(self):
pass
class Adaptee: “””源对象类”””
def speciafic_function(self):
print('被适配对象的特殊方法')
class Adapter(Adaptee, Target): “””适配器”””
def function(self):
print('进行功能转换')
```
适配模式的实现有两种方试:一种是组合方式,一种是继承方式。
Targe是一个类的接口,是提供给用户调用的接口对象,如故事剧情种ISocket。Adaptee是要进行适配的对象类,如故事剧情种的BritishSocket的name()和socketInterface()方法包装成ISocket的get_name()和get_socket()接口。
适配模式的两种方式,我比较推荐组合的方式,因为在一些没有interface类型的编程语言中,Adapter类就会多继承,同时继承Target和Adaptee,在程序设计中尽量避免多继承。
适配模式要点
适配模式中主要有三个角色,在设计适配模式时要找到并区分这些角色。