zoukankan      html  css  js  c++  java
  • 设计模式-结构性模式

    适配器模式

    # 类似于变压器  使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
    
    """
    内容:
        将一个类的接口转换成客户希望的另一个接口。
        适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
    角色:
        目标接口(Target)
        待适配的类(Adaptee)
        适配器(Adapter)
    两种实现方式:
        类适配器:使用多继承
        对象适配器:使用组合
    """
    # 适用场景
    """
    适用场景:
    想使用一个已经存在的类,而它的接口不符合你的要求
    (对象适配器)想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
    """

    代码实现

    from abc import abstractmethod, ABCMeta
    
    
    class Payment(metaclass=ABCMeta):
        @abstractmethod
        def pay(self, money):
            raise NotImplementedError
    
    
    class Alipay(Payment):
        def pay(self, money):
            print("支付宝支付%s元" % money)
    
    
    class ApplePay(Payment):
        def pay(self, money):
            print("苹果支付%s元" % money)
    
    
    # ------待适配类------
    class PaymentB(metaclass=ABCMeta):
        @abstractmethod
        def huaqian(self, money):
            raise NotImplementedError
    
    
    class WechatPay(PaymentB):
        def huaqian(self, money):
            print("微信支付%s元" % money)
    
    
    class BankPay(PaymentB):
        def huaqian(self, money):
            print("银行卡支付%s元" % money)
    
    
    # ------类适配器------
    
    class RealWeChatPay(Payment, WechatPay):
        def pay(self, money):
            return self.huaqian(money)
    
    
    p = Alipay()
    p = RealWeChatPay()
    p.pay(100)
    
    
    # ------对象适配器------
    class PayAdapter(Payment):
        def __init__(self, payment):
            self.payment = payment
    
        def pay(self, money):
            return self.payment.huaqian(money)
    
    
    p = Alipay()
    p = PayAdapter(BankPay())
    p.pay(1000)
    
    # PayAdapter(WechatPay()).pay(1000)

    代理模式

    """
    内容:
        为其他对象提供一种代理以控制对这个对象的访问。
    角色:
        抽象实体(Subject)
        实体(RealSubject)
        代理(Proxy)
    适用场景:
        远程代理:为远程的对象提供代理  # 对象在远程服务器
        虚代理:根据需要创建很大的对象
        保护代理:控制对原始对象的访问,用于对象有不同访问权限时
    优点:
        远程代理:可以隐藏对象位于远程地址空间的事实
        虚代理:可以进行优化,例如根据要求创建对象
        保护代理:允许在访问一个对象时有一些附加的内务处理
    """

    代码实现

    from abc import ABCMeta, abstractmethod
    
    
    class Subject(metaclass=ABCMeta):
        @abstractmethod
        def get_content(self):
            pass
    
        @abstractmethod
        def set_content(self, content):
            pass
    
    
    class RealSubject(Subject):
        def __init__(self, filename):
            self.filename = filename
            print("读取%s文件内容" % filename)
            f = open(filename, encoding='utf-8')
            self.content = f.read()
            f.close()
    
        def get_content(self):
            return self.content
    
        def set_content(self, content):
            f = open(self.filename, 'w', encoding='utf-8')
            f.write(content)
            f.close()
    
    
    # 虚代理
    class ProxyB(Subject):
        def __init__(self, filename):
            self.filename = filename
            self.subj = None
    
        def get_content(self):
            if not self.subj:
                self.subj = RealSubject(self.filename)
            return self.subj.get_content()
    
    
    s = ProxyB("test.py")
    
    
    # print(s.get_content())
    
    
    class ProxyC(Subject):
        def __init__(self, filename):
            self.subj = RealSubject(filename)
    
        def get_content(self):
            self.subj.get_content()
    
        def set_content(self, content):
            raise PermissionError("没有写权限")
    
        # 写一个set_content

    1

  • 相关阅读:
    SpringMVC在使用Jackson2时关于日期类型格式化的问题
    Redis入门到高可用(八)——list
    LongAdder,AtomicIntegerFieldUpdater深入研究
    Redis入门到高可用(七)——Hash
    CAS缺点
    MySQL 当记录不存在时插入(insert if not exists)
    Redis入门到高可用(六)—— 字符串
    jsonp 跨域
    jvm
    指令重排序
  • 原文地址:https://www.cnblogs.com/daofaziran/p/11007083.html
Copyright © 2011-2022 走看看