码迷,mamicode.com
首页 > 其他好文 > 详细

【编程思想】【设计模式】【行为模式Behavioral】Specification

时间:2018-05-14 13:47:05      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:tis   分享图片   模式   nbsp   .com   bool   图片   技术   wrap   

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转载版

 

【编程思想】【设计模式】【行为模式Behavioral】Specification

标签:tis   分享图片   模式   nbsp   .com   bool   图片   技术   wrap   

原文地址:https://www.cnblogs.com/demonzk/p/9035662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!