基类中模板方法的用途是什么?

Aak*_*ash 5 c# base-class template-method-pattern

嗯,我正在经历这个关于"在MSDN上的优秀文章基类用途 ".虽然我理解基类和接口的概念,但我无法理解本文第二段中的模板方法的用法(" 受保护的方法和构造函数 ").

有没有人可以借助一个简单的实际例子帮助我理解这个概念?或许,理解模板方法的概念是一个很好的起点.

提前致谢.

Gie*_*ius 2

在我看来,这是一篇很老的文章,不记得见过用 Impl 命名。

我认为维基百科有更好的描述:
模板方法用于:

  • 让子类实现(通过方法重写)可以变化的行为

  • 避免代码重复:一般工作流结构在抽象类的算法中实现一次,并在每个子类中实现必要的变化。

  • 控制在什么时候允许子类化。与简单的多态覆盖相反,在简单的多态覆盖中,基本方法将被完全重写,从而允许对工作流进行彻底的更改,而只允许更改工作流的特定细节。

作为模板模式应用结果的控制结构(控制反转)通常被称为好莱坞原则:“不要打电话给我们,我们会打电话给你。” 利用这个原理,父类中的模板方法通过根据需要调用子类方法来控制整个过程。

简而言之,您在基类中定义骨架,派生类实现实现之间的差异。

假设我们有必须发布到不同渠道的信息。
因此,我们创建基类 Publisher,它具有如何做到这一点的框架。
我们强制实现初始化,每个派生都会设置发布地址。
我们进行发送实现,适合大多数渠道,如果某些渠道使用 ftp 而不是 http,我们可以覆盖发送。
记录到数据库所做的事情对于所有通道都是相同的,所以我们不允许覆盖它。
只有发布对 Publisher 派生类的用户感兴趣,因此只有该方法是公共的。

public abstract class Publisher 
{
      private address;
      // if you wish to force implementation in derived class, make method abstract
      private abstract void Initialize();
      // if you wish optional implementation in derived class, make it virtual
      protected virtual void SendChangesToWeb() 
      {
         // ...
         webClient.Upload(address, data)
      }

      // if you wish that some step could not be changed from outside 
      private void LogSentChangesToDatabase() 
      {
         // ... save date time when was send and what was sent
      }

      // this sequence is the same for all derives, no point to duplicate 
      public void PublishUpdates() 
      {
           Initialize();
           SendChangesToWeb();
           LogSentChangesToDatabase();
      }
}

public class GooglePublisher : Publisher {
     private override Initialize() 
     {
         address = "http://www.google.com";
     }         
}

public class FtpPublisher : Publisher {
     private override Initialize() 
     {
         address = "ftp://test.com";
     }     

     protected override SendChangesToWeb() 
     {
        FtpClient.Upload(address, data)
     }
}
Run Code Online (Sandbox Code Playgroud)