簡體   English   中英

重載和策略模式

[英]Overloading and strategy pattern

我正在嘗試編寫一個電子郵件傳遞系統。 對於所有用戶,我有這個枚舉,在過去 3 個月和 6 個月內登錄的用戶:

class Receiver(enum.Enum):
    ALL = "ALL"
    THREE_MONTHS = "THREE_MONTHS"
    SIX_MONTHS = "SIX_MONTHS"

問題是,我正在嘗試實現Strategy 模式,所以我需要強制執行類型檢查 我知道默認情況下這是不可能的,但是......任何想法都會受到贊賞。

我需要它看起來像:

def send_to(Receiver.ALL):
    pass

def send_to(Receiver.THREE_MONTHS):
    pass

def send_to(Receiver.SIX_MONTHS):
    pass

是的,我有Java背景

並且一般發件人會相應地傳遞值:

@api_view(["POST"])
def send_email(request):
        email_to = request.data["emailTo"]
        send_to(email_to)

注意:我不想編寫多個 if 檢查或 switch case。 這完全違背了 Bob 大叔的 Open Closed 原則,因為如果有額外的情況,則必須修改方法。 絕對不能接受。

Python沒有函數重載。 它所擁有的是一流的函數對象。

創建一個將Receiver值映射到適當函數的dict

def send_to_all():
    pass

def send_to_last_three_months():
    pass

def send_to_last_six_months():
    pass

senders = {
    Receiver.ALL: send_to_all,
    Receiver.THREE_MONTHS: send_to_last_three_months,
    Receiver.SIX_MONTHS: send_to_last_six_months,
}

@api_view(["POST"])
def send_email(request):
    email_to = request.data["emailTo"]
    sender = senders[email_to]
    sender()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM