C++ Exceptional 模板设计模式(Template Design Model)

首先看一下下面一段代码:

class GenericTableAlgorithm
{
public:
    GenericTableAlgorithm(const string& table);
    virtual ~GernericTableAlgorithm();
    // Process() returns true if and only if successful.
    // It does all the work: a) physically reads the
    // table's records, calling Filter() on each to 
    // determine whether it should be included in the
    // rows to be processed; and b) when the list of rows
    // to operate upon is complete, calls ProcessRow()
    // for each such row.
    bool Process();
private:
    // Filter() returns true if and only if the row
    // should be included in the ones to be processed.
    // The default action is to return true (to include
    // every row.
    virtual bool Filter(const Records&);
    // ProcessRow() is called once per record that
    // was included for processing. This is where
    // the concrete class does its specialized work.
    // (Note: This means every row to be processed
    //  will be read twice, but assume that that is
    // necessary and not an efficiency consideration. )
    virtual bool ProcessRow(const PrimaryKey&) = 0;
    struct GenericTableAlgorithmImpl* pimpl_; //MYOB
};

class MyAlgorithm : public GenericTableAlgorithm
{
    // ...override Filter and ProcessRow() to
    // implement a specific operation
};

int main(int argc, char *argv[])
{
    MyAlgorithm a("Customer");
    a.Process();
}
  1. 首先上面类的设计用到的就是模板设计模式,模板设计模式具体的定义如下:
    定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。

  2. 上面的类虽然用到了模板设计模式,但并不是最优的解决方案。一种更好的方案是把父类和子类解构,减少子类对父类的依赖。改善后的代码如下:

//-----------------------------------------------
// File gta.h
//-----------------------------------------------
// Responsibility #1: Providing a public interface that
// encapsulates common functionality as a template method
// This has nothing to do with inheritance relationships, // and can be nicely isolated to stand on its own in a 
// better-focused class. The target audience is external // users of GenericTableAlgorithm.

class GTAClient;

class GenericTableAlgorithm
{
public:
    // Constructor now takes a concrete implementation
    // object.
    GenericTableAlgorithm(const string& table,
                          GTAClient& worker);

    // Since we've separated away the inheritance 
    // relationships, the destructor doesn't need to
    // be virtual
    ~GenericTableAlgorithm();
    bool Process(); // unchanged
private:
    struct GenericTableAlgorithmImpl* pimpl_; //MYOB
};

//-------------------------------------------------
// File gtaclient.h
//-------------------------------------------------
//Responsibility #2: Providing an abtract interface
// for extensibility. This is an implementation detail
// of GenericTableAlgorithm that has nothing to do with
// its external clients, and can be nicely separated out
// into a better-focused abstract protocol class. The 
// target audience is writers of concrete "implementation // detail" classes which work with (and extend)
// GenericTableAlgorithm.

class GTAClient
{
public:
    virtual ~GTAClient() = 0;
    virtual bool Filter(const Records&);
    virtual bool ProcessRow(const PromaryKey&) = 0;
}

//--------------------------------------------
// File gtaclient.cpp
//--------------------------------------------
bool GTAClient::Filter(const Record&)
{
    return true;
}

class MyWorker : public GTAClient
{
    // ... override Filter() and ProcessRow() to
    // implement a specific operation ...
};

int main()
{
    GenericTableAlgorithm a("Customer", MyWorker());
    a.Process();
}

以上代码成功地解构了第一种设计方式子类和父类之间的依赖关系,GenericTableAlgorithmGTAClient之间是一种组合模式,而不是一种继承关系。类与类之间的关系更明确,更清晰。

当然还有一种比以上组合模式更简单的方法,那就是利用模板,如下:

template<typename GTACworker>
bool GenericTableAlgorithm( const string& table)
{
    // ...original contents of Process() go here ...
}

int main()
{
    GenericTableAlgorithm<MyWorker>("Customer");
}

以上方法更加简便和通用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值