两种定制行为的方式:使用参数和使…

      很多能力相对不足的开发。在被指出重复代码要求修改的时候,常有一个困惑:两段代码的确基本一样,但又略有不同或者有较多不同,这样怎么处理。这时候有两个常规武器:使用参数或者使用多态。
      两者之中,使用参数是更常用的方式。其历史很悠久,在C语言时代,大家都是这么提取函数的。缺点是假如要定制的行为比较复杂,会导致要传入一堆的参数,然后代码中各种if-else、switch,降低了代码的可读性,维护也比较困难,因为所有种类的行为都聚在一起,一个几千行甚至更多的超级大类/函数冉冉升起。
      使用多态的优缺点正好和使用参数反过来。如果用它来搞定下小事(如后面的代码),实在是罗里啰嗦。但要定制的行为越来越复杂,他反而可以利用各种设计模式,处理得游刃有余。
      两种方式是互补的。在合适的时候选择合适的武器,才是王道。

===========以下代码要定制的行为很简单,使用参数明显比多态简洁多了===============

#include
#include

using namespace std;

struct Printer
{
virtual ~Printer(){}
virtual void printPrefix() = 0;
virtual void print(const std::string& msg) = 0;
virtual void printPostfix() = 0;
};
void print(Printer& pt, const std::string& msg)
{
pt.printPrefix();
pt.print(msg);
pt.printPostfix();
}
struct StarPrinter
: public Printer
{
public:
virtual void printPrefix()
{
cout << "****************" << endl;
}
virtual void print(const std::string& msg)
{
cout << msg << endl;
}
virtual void printPostfix()
{
printPrefix();
}
};
struct AddPrinter
: public Printer
{
public:
virtual void printPrefix()
{
cout << "++++++++++++++++" << endl;
}
virtual void print(const std::string& msg)
{
cout << msg << endl;
}
virtual void printPostfix()
{
printPrefix();
}
};

void print(const std::string& msg, bool starFlag)
{
cout << ((starFlag) ? "******************" : "++++++++++++++++++") << endl;
cout << msg << endl;
cout << ((starFlag) ? "******************" : "++++++++++++++++++") << endl;
}

int main()
{
print(StarPrinter(), "Hello, World"); // 多态
print(AddPrinter(), "Hello, World");  // 多态

print("Hello, World", true);                  // 参数
print("Hello, World", false);                // 参数
return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值