Python设计模式-适配器模式
基于Python3.5.2,代码如下
#coding:utf-8
class ACpnStaff:
name = ""
id = ""
phone = ""
def __init__(self,id):
self.id = id
def getName(self):
print("A protocol getName method ..id:%s"%self.id)
return self.name
def setName(self,name):
print("A protocol setName method ..id:%s" % self.id)
self.name = name
def getPhone(self):
print("A protocol getPhone method ..id:%s" % self.id)
return self.phone
def setPhone(self,phone):
print("A protocol setPhone method ..id:%s" % self.id)
self.phone = phone
class BCpnStaff:
name = ""
id = ""
telephone = ""
def __init__(self, id):
self.id = id
def getName(self):
print("B protocol getName method ..id:%s" % self.id)
return self.name
def setName(self, name):
print("B protocol setName method ..id:%s" % self.id)
self.name = name
def getPhone(self):
print("B protocol getPhone method ..id:%s" % self.id)
return self.telephone
def setPhone(self, telephone):
print("B protocol setPhone method ..id:%s" % self.id)
self.telephone = telephone
class CpnStaffAdapter:
b_cpn = ""
def __init__(self,id):
self.b_cpn = BCpnStaff(id)
def getName(self):
return self.b_cpn.getName()
def getPhone(self):
return self.b_cpn.getPhone()
def setName(self,name):
self.b_cpn.setName(name)
def setPhone(self,phone):
self.b_cpn.setPhone(phone)
if __name__ == "__main__":
acpn_staff = ACpnStaff("123")
acpn_staff.setPhone("wuzi")
acpn_staff.setName("wuzi1")
bcpn_staff = CpnStaffAdapter("456")
bcpn_staff.setName("wuzib")
bcpn_staff.setPhone("phoneb")
适配器模式分析与解读
适配器模式
将一个类的接口变换成客户端期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式和装饰模式有一定的相似性,都起包装的作用,但二者本质上又是不同的,装饰模式的结果,是给一个对象增加了一些额外的职责,而适配器模式,则是将另一个对象进行了“伪装”。两个类做的事情相,但具有不同的接口时要使用该模式,可以使客户端统一调用同一接口。适配器通常是对现在业务的补偿式应用,在设计阶段尽量不要用适配器模式。
适配器模式的适用场景
1、在不修改现有接口,同时也要使该接口适用或兼容新场景业务中,适合适用适配器模式。
解读
代码中,是实现在A公司中调用B公司的方法。由于A公司与B公司所采用的协议不同,需要对接口进行包装
1、在A公司中的员工信息,使用A公司的协议来实现信息插入,查询等,由ACpnStaff类来实现;
2、在B公司中的员工信息,使用B公司的协议来实现信息插入、查询等,由BCpnStaff类来实现;
3、在A公司中调用B的方法接口,通过CpnStaffAdapter类,在初始化的时候就创建一个B公司员工对象,在通过适配器类setName(),setPhone()等方法,直接调用B对象的对应方法,从而实现对B对象的操作。
程序运行结果如下:
A protocol setPhone method ..id:123
A protocol setName method ..id:123
B protocol setName method ..id:456
B protocol setPhone method ..id:456
通过运行结果,显示通过CpnStaffAdapter实例生成的对象,能够对B对象进行相应的读写操作。从而在不修改B的基础上完成,在A处调用B接口。
适配器模式的优缺点
优点:
1、适配器模式可以让两个接口不同,甚至关系不大的两个类一起运行;
2、提高了类的复用度,经过“伪装”的类,可以充当新的角色;
3、适配器可以灵活“拆卸”。
缺点:
1、适配器模式与原配接口相比,毕竟增加了一层调用关系,所以,在设计系统时,不要使用适配器模式。
备注
该模式要谨慎使用,模式的乱用不如不用,能够预见解决的就解决。