设为首页 加入收藏

TOP

消息发送VS设计模式 C++沉思录的一练习题的另解(二)
2014-11-24 00:04:11 来源: 作者: 【 】 浏览:60
Tags:消息 发送 设计模式 沉思 习题
t i=0; i out << '-';
out << '+';
}
else
{
out << '|';
prevImp.PrintRow(nRow-1, out);
out << '|';
}
}
return 0;
}


class CHorseDecorater
{
public:
CHorseDecorater(PictureImp& impLeft, PictureImp& impRight)
{
m_Left = impLeft;
m_Right = impRight;
impLeft.pThis = this;
impLeft.proc = HandleMsg;
impRight.pThis = this;
impRight.proc = HandleMsg;
}

private:
PictureImp m_Left;
PictureImp m_Right;

static int HandleMsg(void* pThis, int nMessage, void* param1, void* param2);
static void PrintRow(PictureImp& pict, int nRow, ostream& out)
{
if (nRow < pict.GetHeight())
pict.PrintRow(nRow, out);
else
{
for (int i=0; i out << ' ';
}
}
};

int CHorseDecorater::HandleMsg(void* pThis, int nMessage, void* param1, void* param2)
{
CHorseDecorater* pSelf = (CHorseDecorater*)pThis;
PictureImp& pictLeft = pSelf->m_Left;
PictureImp& pictRight = pSelf->m_Right;
switch (nMessage)
{
case PM_WIDTH:
return pictLeft.GetWidth()+pictRight.GetWidth();;

case PM_HEIGHT:
return max(pictLeft.GetHeight(), pictRight.GetHeight());

case PM_PRINT_ROW:
int nRow = (int)param1;
ostream& out = *(ostream*)param2;
PrintRow(pictLeft, nRow, out);
PrintRow(pictRight, nRow, out);
}
return 0;
}

int main()
{
const char* init1[] = {"Paris", "in the", "Spring", "HaHa"};
CPicture pict1(init1, 3);
pict1.Print(cout);
CFrameDecorater framer1(pict1.m_Imp);
//pict1.Print(cout);
CFrameDecorater framer2(pict1.m_Imp);
pict1.Print(cout);
CPicture pict2(init1, 4);
CHorseDecorater hors(pict1.m_Imp, pict2.m_Imp);
pict1.Print(cout);
CFrameDecorater framerHorse(pict1.m_Imp);
pict1.Print(cout);
return 0;
}


嗯,明眼人一眼就看出来了,切,这不过是模仿WINDOWS的窗口消息处理函数的伎俩而已。没有继承、没有虚函数,何其美妙哉!

又,注意到main()中的代码,虽然pict1被装饰了好几次,但其图片打印,始终都是pict1.Print(cout)。所谓不管八风乱起,我自岿然不动
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一种简单的跨平台用户态自旋锁 下一篇C语言实现《大话设计模式》中的观..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: