Builder / Director

from time import sleep
 
#首先,定义一个车的实体,并定义属性变量
class Car(object):
    def __init__(self):
        # 准备的钱
        self.money = None
 
        # 去哪里看车
        self.address = None
 
        # 试驾什么车
        self.car_name = None
 
        # 购买时间是
        self.buy_time = None
        
    def __str__(self):
        return "准备了:%s,去%s看车,试驾了%s,下单了,购买时间是:%s" % (self.money, self.address, self.car_name, self.buy_time)
    
#创建一个 Builder,实例化一个 Car 对象
class CarBuilder(object):
    def __init__(self):
        self.car = Car()
 
    def ready_money(self, money):
        """
        准备的金额
        :param money:
        :return:
        """
        self.car.money = money
        sleep(0.5)
        return self
 
    def see_car(self, address):
        """
        去哪里看车
        :param address:
        :return:
        """
        self.car.address = address
        sleep(0.5)
        return self
 
    def test_drive(self, car_name):
        """
        试驾了什么车
        :param car_name:
        :return:
        """
        self.car.car_name = car_name
        sleep(0.5)
        return self
 
    def buy_car(self, buy_time):
        """
        下单时间
        :param buy_time:
        :return:
        """
        self.car.buy_time = buy_time
        sleep(0.5)
        return self
    
#创建 Director,创建 build 方法,使用 Builder 一步步构建一个车对象并返回
class Director(object):
    def __init__(self):
        self.builder = None
 
    def build(self, builder): # 控制组装顺序
        self.builder = builder
        self.builder. ready_money("30万"). see_car("4S店"). test_drive("奥迪A4L"). buy_car("2022年8月1日")
 
        # 返回构建的对象
        return self.builder.car
    
if __name__ == '__main__':
    # 实例化一个构建者对象
    car_builder = CarBuilder()
    # 实例化一个负责人
    director = Director()
 
    # 构建的对象
    car = director.build(car_builder)
 
    print(car)
复制代码
二、结构类模式
1.适配器模式
内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
1.适用场景:想使用一个已经存在的类,而他的接口不符合要求
2.两种实现方式:

类适配器:使用多继承

# 当我们需要改动部分的代码很少的时候,我们直接多继承+复写方法即可
from abc import ABCMeta,abstractclassmethod

class Payment(metaclass=ABCMeta):
    @abstractclassmethod
    def pay(self,money):
        pass

class Alipay(Payment):
    def pay(self,money):
        print("阿里支付了{}元".format(money))

class Weixinpay(Payment):
    def pay(self,money):
        print("微信支付了{}元".format(money))

class Bankpay:
    def cost(self,money):
        print("银行卡支付{}元".format(money))

class NewBankPay(Payment,Bankpay):
    def pay(self,money):
        self.cost(money)

nb = NewBankPay()
nb.pay(100)
复制代码

对象适配器:使用组合

from abc import ABCMeta,abstractclassmethod

class Payment(metaclass=ABCMeta):
    @abstractclassmethod
    def pay(self,money):
        pass

class Alipay(Payment):
    def pay(self,money):
        print("阿里支付了{}元".format(money))

class Weixinpay(Payment):
    def pay(self,money):
        print("微信支付了{}元".format(money))

# 当存在多个需要进行适配的代码的时候(对象适配器)
class Bankpay:
    def cost(self,money):
        print("银行卡支付{}元".format(money))

class Applepay:
    def cost(self,money):
        print("苹果支付{}元".format(money))

class PaymentAdapter(Payment):
    def __init__(self,payment):
        self.payment = payment

    def pay(self,money):
        self.payment.cost(money)

nb = PaymentAdapter(Bankpay())
nb.pay(100)

Last updated