中介模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他妈呢之间的交互。
设计要点:中介模式主要有三个角色,在设计中介模式时要找到并区分这些角色:
(1)交互对象:要进行交互的一系列对象
(2)中介者:负责协调各个对象之间的交互
(3)具体中介者:中介的具体实现
以员工入职流程为例:员工收到offer后,去公司入职。员工最终是去公司的某一个具体部门,但是在入职过程中,员工并不会接触部门,一切事项与人事进行交互。在这里,员工是员工与部门是交互对象,人事属于中介。如下:
class HR:
"""人事类"""
def __init__(self):
self.__employee_info = {}
self.__departments = []
def get_employee_info(self, name, department, job_title, salary):
self.__employee_info[name] = [department, job_title, salary]
def check_info(self, employee):
_name, _department = employee.get_basic_info()
for department in self.__departments:
info = department.get_employee_info()
if info.get(_department) and info.get(_department).get(_name):
self.sign_contract(info.get(_department).get(_name))
return
print("很抱歉{0}先生/女士,没有检索到您在{1}部门的相关信息,请你确认信息!".format(_name, _department))
def add_department(self, department):
self.__departments.append(department)
def sign_contract(self, employee_info):
print("签订合同:{0}入职XXXX公司{1}部{2}职位, 薪资每月:{3}元".format(employee_info[0], employee_info[1],
employee_info[2], employee_info[3]))
class Employee:
"""员工类"""
def __init__(self, name, department):
self.__name = name
self.__department = department
def get_basic_info(self):
return self.__name, self.__department
class Departmenet:
"""部门类"""
def __init__(self, department):
self.__department = department
self.__employee_info = {self.__department: {}}
def set_employee_info(self, name, job_title, salary):
self.__employee_info[self.__department][name] = [name, self.__department, job_title, salary]
return self
def get_employee_info(self):
return self.__employee_info
def test():
hr = HR()
hr.add_department(Departmenet("经纪").set_employee_info("张三", "开发工程师", "10000"))
hr.add_department(Departmenet("经纪").set_employee_info("李四", "开发工程师", "12000"))
hr.add_department(Departmenet("财富").set_employee_info("王五", "开发工程师", "14000"))
hr.add_department(Departmenet("信托").set_employee_info("吴六", "开发工程师", "16000"))
hr.check_info(Employee("张三", "经纪"))
hr.check_info(Employee("王五", "财富"))
hr.check_info(Employee("张四", "经纪"))
hr.add_department(Departmenet("经纪").set_employee_info("张四", "开发工程师", "15000"))
hr.check_info(Employee("张四", "经纪"))
test()
应用场景:
(1)一组对象以定义良好但复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
(2)一个对象引用其他很多对象并且直接与这些对象通信,导致难以服用该对象。
(3)想通过一个中间类来封装多个类中的行为,同时又不想生成太多的子类。