使用命令设计模式来消除重复的代码

时间:2019-02-25 23:54:20

标签: python design-patterns

比方说,我有一个可以创建和删除文件的程序。我有2种不同的方法-执行已经处理了这些操作的外部实用程序,或者在程序中实现创建和删除操作。我想同时选择两者,并在运行时动态选择适当的一个。因此,我将拥有与此类似的接口和实现:

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

这样,我可以在运行时选择它们之一并使用它。但是,如果我决定创建另一个实现,它是ExecFileImplFile之间的混合体,那么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的类,这些类基本上只执行一个操作

P.S这可能是一个不好的例子,但没有想到更好的了。另外,该问题并没有特别针对Python,仅用于表示示例。

1 个答案:

答案 0 :(得分:0)

合成器就是答案。 您必须保留接口,而实现会同时使用这两个实例(通常通过构造函数),并在它们上触发适当的方法。