开发者社区> 问答> 正文

使用Command设计模式消除重复代码

python小能手 2019-02-28 13:42:32 323

假设我有一个可以创建和删除文件的程序。我有两种不同的方法 - 执行已经处理这些操作的外部实用程序,或者从我的程序中实现创建和删除。我想要选择两者并在运行时动态选择合适的一个。所以我会有类似这样的接口和实现:

class IFile:

def create():
    pass

def delete():
    pass

class ExecFile(IFile):

def create():
    # Call an external executable

def delete():
    # Call an external executable

class ImplFile(IFile):

def create():
    # Implement creation of the file

def delete():
    # Implement deletion of the file

这样,我可以在运行时选择其中任何一个并使用它。但是,如果我决定再创建一个实现,这是之间的混合ExecFile和ImplFile,因此create()功能会一样ExecFile,但删除相同ImplFile(或它们的组合)。我想过使用命令设计模式解决这个问题,并执行以下操作:

class IFile:

def create():
    pass

def delete():
    pass

class IFileAction:

def exec():
    pass

class ExecCreateFile(IFileAction):

def exec():
     # Call an external executable to create file

class ImplCreateFile(IFileAction):

def exec():
    # Implement creation of the file

class ExecDeleteFile(IFileAction):

def exec():
     # Call an external executable to delete file

class ImplDeleteFile(IFileAction):

def exec():
    # Implement deletion of the file

class ExecFile(IFile):

def create():
    ExecCreateFile().exec()

def delete():
    ExecDeleteFile().exec()

class ImplFileIFile(IFile):

def create():
    ImplCreateFile().exec()

def delete():
    ImplDeleteFile().exec()

class ExecImplFile(IFile):

def create():
    ExecCreateFile().exec()

def delete():   
    ImplDeleteFile().exec()

问题:在这种特殊情况下使用这种设计模式是否合适,还是可以做得更好?我唯一担心的是,如果示例更复杂,假设我添加了一个选项来获取文件大小,获取文件所有者等等,我最终会创建多个类型为IFileAction的类,它基本上只执行一个动作。

PS这可能是一个不好的例子,但想不出更好的事情。此外,问题并不是特别指Python,只是用它来表示示例。

分享到
取消 提交回答
全部回答(1)
  • python小能手
    2019-07-17 23:29:42

    Compositor就是答案。您必须保留接口,而实现会消耗两个实例(通常通过构造函数) - 并在它们上触发适当的方法。

    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题