中介模式(python)

本文通过一个房屋租赁的例子展示了中介模式在实际问题中的应用。中介者类`HousingAgency`作为中介,协调`HouseInfo`房源信息、`HouseOwner`房东和`Customer`租客之间的交互,降低了他们的耦合度。用户可以通过中介发布房源、查找匹配的房源并签订租赁合同。中介模式使得系统更易于扩展和维护。
摘要由CSDN通过智能技术生成

"""
中介模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,
        从而使其耦合松散,而且可以独立地改变他们之间的交互
"""


class HouseInfo:
    """房源信息"""

    def __init__(self, area, price, has_window, has_bathroom, has_kitchen, address, owner):
        self.__area = area
        self.__price = price
        self.__has_window = has_window
        self.__has_bathroom = has_bathroom
        self.__has_kitchen = has_kitchen
        self.__address = address
        self.__owner = owner

    def get_address(self):
        return self.__address

    def get_owner_name(self):
        return self.__owner.get_name()

    def show_info(self, is_show_owner=True):
        template = "面积: {}平方米, 价格: {}元, 窗户: {}, 卫生间: {}, 厨房: {}, 地址: {}, 房东: {}."
        print(template.format(self.__area,
                              self.__price,
                              '有' if self.__has_window else '无',
                              self.__has_bathroom,
                              '有' if self.__has_kitchen else '无',
                              self.__address,
                              self.get_owner_name() if is_show_owner else ''))


class HousingAgency:
    """房屋中介"""

    def __init__(self, name):
        self.__houses_info = []
        self.__name = name

    def get_name(self):
        return self.__name

    def add_house_info(self, house_info):
        self.__houses_info.append(house_info)

    def remove_house_info(self, house_info):
        for info in self.__houses_info:
            if info == house_info:
                self.__houses_info.remove(info)
                # 边遍历边删除

    def get_search_condition(self, description):
        """省略将用户描述信息转换成搜索条件的过程"""
        return description

    def get_match_info(self, search_condition):
        """根据房源信息的各项属性查找最匹配的信息,此处省略匹配过程,全部输出"""
        print(self.get_name(), "为您找到以下最合适的房源: ")
        for info in self.__houses_info:
            info.show_info()
        return self.__houses_info

    def sign_contract(self, house_info, period):
        """与房东签订协议"""
        template = "{}与房东{}签订{}的房子的租赁合同,租期{}年,合同期内{}有权对其进行使用和转租。"
        print(template.format(self.get_name(),
                              house_info.get_owner_name(),
                              house_info.get_address(),
                              period,
                              self.get_name()))

    def sign_contracts(self, period):
        for info in self.__houses_info:
            self.sign_contract(info, period)


class HouseOwner:
    """房东"""

    def __init__(self, name):
        self.__name = name
        self.__house_info = None

    def get_name(self):
        return self.__name

    def set_house_info(self, address, area, price, has_window, bathroom, kitchen):
        self.__house_info = HouseInfo(area, price, has_window, bathroom, kitchen, address, self)

    def publish_house_info(self, agency):
        # 发布房源
        agency.add_house_info(self.__house_info)
        template = "{}在{}发布房源出租信息。"
        print(template.format(self.get_name(), agency.get_name()))


class Customer:
    """租客"""

    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def find_house(self, description, agency):
        template = "我是{},我想找一个{}的房子"
        print(template.format(self.get_name(), description))
        return agency.get_match_info(agency.get_search_condition(description))

    def see_house(self, houses_info):
        # 看房,选择最合适的房子,省略看房选房的过程,直接选择最后一个间
        return houses_info[-1]

    def sign_contract(self, house_info, agency, period):
        # 与中介签订协议
        template = "{}与中介签订{}房子的租赁合同,租期{}年。合同期内{}有权对其进行使用!"
        print(template.format(self.get_name(),
                              agency.get_name(),
                              period,
                              self.get_name()))


def test_renting():
    my_home = HousingAgency("我爱我家")

    zhangsan = HouseOwner("张三")
    zhangsan.set_house_info("上地西亚", 20, 2500, 1, '独立卫生间', 0)
    zhangsan.publish_house_info(my_home)

    lisi = HouseOwner("李四")
    lisi.set_house_info('当代城市家园', 16, 1800, 1, '公用卫生间', 0)
    lisi.publish_house_info(my_home)

    wangwu = HouseOwner('王五')
    wangwu.set_house_info('金隅美和园', 18, 2600, 1, '独立卫生间', 1)
    wangwu.publish_house_info(my_home)

    print()

    my_home.sign_contracts(3)

    tony = Customer('Tony')
    houses_info = tony.find_house('20平米左右,要有独立卫生间、厨房,房间有床,朝南,价格不高于2000!', my_home)

    appropriate_house = tony.see_house(houses_info)
    tony.sign_contract(appropriate_house, my_home, 1)


if __name__ == '__main__':
    test_renting()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中介模式是一种行为设计模式,它使得对象间的通信通过一个中介对象来进行,从而降低了对象间的直接耦合性。Python可以使用以下方式实现中介模式: ```python class Mediator: def __init__(self): self.colleague1 = Colleague1(self) self.colleague2 = Colleague2(self) def notify_colleague1(self, message): self.colleague2.process_message(message) def notify_colleague2(self, message): self.colleague1.process_message(message) class Colleague1: def __init__(self, mediator): self.mediator = mediator def send_message(self, message): self.mediator.notify_colleague2(message) def process_message(self, message): print(f"Colleague1 received message: {message}") class Colleague2: def __init__(self, mediator): self.mediator = mediator def send_message(self, message): self.mediator.notify_colleague1(message) def process_message(self, message): print(f"Colleague2 received message: {message}") ``` 在上面的代码中,我们定义了一个中介者 `Mediator` 和两个同事 `Colleague1` 和 `Colleague2`。中介者持有两个同事的实例,并且提供了通知同事的方法。当某个同事调用 `send_message` 方法时,它会将消息传递给中介者,中介者再将消息传递给另一个同事,从而完成了同事间的通信。 可以使用以下代码测试上述实现: ```python mediator = Mediator() colleague1 = Colleague1(mediator) colleague2 = Colleague2(mediator) colleague1.send_message("Hello from Colleague1!") colleague2.send_message("Hello from Colleague2!") ``` 输出结果为: ``` Colleague2 received message: Hello from Colleague1! Colleague1 received message: Hello from Colleague2! ``` 从输出结果可以看出,同事间的消息可以通过中介者进行传递,从而实现了对象间的解耦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值