【问题标题】:Can two strategies in a strategy pattern use the same code? Does this make it a template pattern?策略模式中的两个策略可以使用相同的代码吗?这是否使它成为模板模式?
【发布时间】:2020-07-09 11:55:51
【问题描述】:

我有一个程序将文件从一台计算机传输到另一台计算机,它使用 4 个不同的 A、B、C 和 D 类。我的程序创建一个对象并使用 A 和 B 来检查和验证要发送的文件。现在我必须添加一个额外的传输技术。我想使用策略模式将是最好的情况,因为我们可以选择任何一种传输技术。但我想问一下,我们是否也可以使用 A 类和 B 类来验证我的策略中的文件传输?这是否使它成为模板设计模式而不是策略设计模式?

【问题讨论】:

  • 是的,您可以重复使用验证。不,这不会创建模板。 Strategy 和 Template 的区别分别在于组合和继承。
  • 那么这里建议的模式是什么?我希望我的两种传输技术松散耦合。我应该使用继承还是组合?
  • 这是一个观点和背景问题,但您可以在此处阅读更多关于差异的信息:stackoverflow.com/questions/669271/…。从没有设计模式开始,并以任何清晰易读的方式解决问题。

标签: design-patterns strategy-pattern


【解决方案1】:

如果您的策略非常复杂并且有一个共同的架构(即验证部分),那么您可以拥有一个进行验证的策略模板,而不是每个具体的策略类来完成其余的工作:

public interface ITransferFileStrategy {
     bool TransferFile(File f);
}

public abstract class TransferFileStrategyTemplate {
     public bool TransferFile(File f) {
         if (!ValidateFile(f)) return false;
         return TransferFileInner(f);
     }
     protected virtual bool ValidateFile(File f) {
        //implement it here
     }

     protected abstract bool TransferFileInner(File f);
}

public class TransferFileStrategyA {
    protected override bool TransferFileInner(File f) { ... }
}

如果您知道会有不同类型的验证,您甚至可以在 TransferFileStrategyTemplate 中使用嵌套策略 (IValidationStrategy) 来处理验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多