2016-05-18 21 views
6

Tôi hiểu rằng vì Python có các hàm hạng nhất, sử dụng mẫu Chiến lược thường chỉ là vấn đề chuyển một hàm làm đối số và không yêu cầu học sinh có lớp học. Nhưng điều gì sẽ xảy ra nếu "chiến lược" không phải là các hàm đơn lẻ, mà là các nhóm các hàm liên quan được chọn một cách hợp lý như một tập hợp?Mô hình chiến lược trong Python khi một "chiến lược" bao gồm nhiều hơn một hàm

Giống như, đây là một tầm thường và giả tạo Ví dụ:

class HexFormatter(object): 
    """Base class for strategies to format hexadecimal numbers.""" 
    pass 

class Motorola(HexFormatter): 
    """Format Motorola style (e.g. $1234)""" 
    @staticmethod 
    def formatbyte(n): 
    return "$%02X" % n 

    @staticmethod 
    def formatword(n): 
    return "$%04X" % n 

class Intel(HexFormatter): 
    """Format Intel-style (e.g. 1234h)""" 
    @staticmethod 
    def formatbyte(n): 
    return "%02Xh" % n 

    @staticmethod 
    def formatword(n): 
    return "%04Xh" % n 

Ý tưởng là bạn chọn một chiến lược và bạn sẽ có được chức năng cho byte định dạng và chức năng để định dạng chữ như một tập hợp, hơn là cần phải xác định chúng riêng lẻ. Ví dụ này giống như cách bạn thực hiện nó bằng một ngôn ngữ như C++ (ngoại trừ các phương thức sẽ không tĩnh vì bạn không thể có các phương thức tĩnh ảo trong C++) và nó không giống như nó không hoạt động trong Python. Nhưng nó liên quan đến việc xác định một loạt các "lớp" chỉ có các phương pháp tĩnh và không có nghĩa là được khởi tạo, mà dường như không có Pythonic bằng cách nào đó.

Có cách nào thành ngữ hơn để thực hiện việc này bằng Python không?

+0

Nó cần thiết cho chiến lược là đối tượng duy nhất? Nếu không, bạn có thể chuyển nhiều hàm, ví dụ: thông qua các đối số từ khóa hoặc có thể chuyển tuple hoặc có tên là bộ hàm. –

Trả lời

4

Một lựa chọn Tôi đã tìm thấy khá thoải mái khi bạn có nhiều chức năng trong từng chiến lược, mặc dù có lẽ một chút quá nhiều cho một cái gì đó như là nhỏ như thế này, là để xác định từng chiến lược trong một mô-đun riêng biệt

motorola. py

def formatbyte(n): 
    return "$%02X" % n 

def formatword(n): 
    return "$%04X" % n 

intel.py

def formatbyte(n): 
    return "%02Xh" % n 

def formatword(n): 
    return "%04Xh" % n 

Th vi là các mô-đun là các đối tượng hạng nhất trong Python như bạn đã chỉ ra, bạn có thể đơn giản truyền chúng khi sử dụng chiến lược của bạn.


Cách khác là chỉ xem xét chuyển từng phần tử của chiến lược dưới dạng tham số hàm đơn giản cho bất kỳ thứ gì chúng được sử dụng cho mã khách hàng dựa trên ngữ cảnh của bạn. Ví dụ thay vì phải

def some_func(obj): 
    obj.format_byte(...) 
    # other stuff 
    obj.format_word(...) 

Bạn có thể có

def some_func(format_byte, format_word): 
    format_byte(...) 
    # 
    format_word(...) 

Trong bất kỳ trường hợp nó không có ý nghĩa để đi con đường OOP nếu bạn không có hơn các phương pháp tĩnh cho mỗi chiến lược - không có hai các cá thể của bất kỳ kiểu nào sẽ khác nhau vì không có dữ liệu cá thể.

Các vấn đề liên quan