zoukankan      html  css  js  c++  java
  • 【编程思想】【设计模式】【行为模式Behavioral】Specification

    Python版

    https://github.com/faif/python-patterns/blob/master/behavioral/specification.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    @author: Gordeev Andrey <gordeev.and.and@gmail.com>
    
    *TL;DR80
    Provides recombination business logic by chaining together using boolean logic.
    """
    
    from abc import abstractmethod
    
    
    class Specification(object):
    
        def and_specification(self, candidate):
            raise NotImplementedError()
    
        def or_specification(self, candidate):
            raise NotImplementedError()
    
        def not_specification(self):
            raise NotImplementedError()
    
        @abstractmethod
        def is_satisfied_by(self, candidate):
            pass
    
    
    class CompositeSpecification(Specification):
    
        @abstractmethod
        def is_satisfied_by(self, candidate):
            pass
    
        def and_specification(self, candidate):
            return AndSpecification(self, candidate)
    
        def or_specification(self, candidate):
            return OrSpecification(self, candidate)
    
        def not_specification(self):
            return NotSpecification(self)
    
    
    class AndSpecification(CompositeSpecification):
        _one = Specification()
        _other = Specification()
    
        def __init__(self, one, other):
            self._one = one
            self._other = other
    
        def is_satisfied_by(self, candidate):
            return bool(self._one.is_satisfied_by(candidate) and
                        self._other.is_satisfied_by(candidate))
    
    
    class OrSpecification(CompositeSpecification):
        _one = Specification()
        _other = Specification()
    
        def __init__(self, one, other):
            self._one = one
            self._other = other
    
        def is_satisfied_by(self, candidate):
            return bool(self._one.is_satisfied_by(candidate) or
                        self._other.is_satisfied_by(candidate))
    
    
    class NotSpecification(CompositeSpecification):
        _wrapped = Specification()
    
        def __init__(self, wrapped):
            self._wrapped = wrapped
    
        def is_satisfied_by(self, candidate):
            return bool(not self._wrapped.is_satisfied_by(candidate))
    
    
    class User(object):
    
        def __init__(self, super_user=False):
            self.super_user = super_user
    
    
    class UserSpecification(CompositeSpecification):
    
        def is_satisfied_by(self, candidate):
            return isinstance(candidate, User)
    
    
    class SuperUserSpecification(CompositeSpecification):
    
        def is_satisfied_by(self, candidate):
            return getattr(candidate, 'super_user', False)
    
    
    if __name__ == '__main__':
        print('Specification')
        andrey = User()
        ivan = User(super_user=True)
        vasiliy = 'not User instance'
    
        root_specification = UserSpecification().
            and_specification(SuperUserSpecification())
    
        print(root_specification.is_satisfied_by(andrey))
        print(root_specification.is_satisfied_by(ivan))
        print(root_specification.is_satisfied_by(vasiliy))
    
    
    ### OUTPUT ###
    # Specification
    # False
    # True
    # False
    Python转载版
  • 相关阅读:
    [iOS开发] 使用Jenkins自动打包并上传至蒲公英
    修改Jenkins的BUILD_NUMBER
    RabbitMQ on windows开启远程访问
    SpringMVC 表单复选框处理
    Spring文件上传配置
    ES6中Reflect 与 Proxy
    vuex中getter的用法
    Toast组建的实现
    link和@import的区别
    Vue组件之props选项
  • 原文地址:https://www.cnblogs.com/demonzk/p/9035662.html
Copyright © 2011-2022 走看看