Aak*_*ash 5 c# base-class template-method-pattern
嗯,我正在经历这个关于"在MSDN上的优秀文章基类用途 ".虽然我理解基类和接口的概念,但我无法理解本文第二段中的模板方法的用法(" 受保护的方法和构造函数 ").
有没有人可以借助一个简单的实际例子帮助我理解这个概念?或许,理解模板方法的概念是一个很好的起点.
提前致谢.
在我看来,这是一篇很老的文章,不记得见过用 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)
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |