学习 chrome 中的 delegate

    技术2025-07-17  11

    class Pump { public: class Input { public: virtual void DoInput() = 0; }; class Output { public: virtual void Dooutput() = 0; }; void Run(Input* in, Output* out) { in->DoInput(); out->Dooutput(); } }; class MsgInput: public Pump::Input { public: virtual void DoInput() {cout << "MsgInput" << endl;} }; class MsgOutput: public Pump::Output { public: virtual void Dooutput() {cout << "Msgoutput" << endl;} }; int main() { MsgInput inmsg; MsgOutput outmsg; Pump pump; pump.Run(&inmsg, &outmsg); } 

     

    将一组需要抽象的操作放到一个nested的抽象类中,将具体实现在类外继承相应的抽象类,实现相应的具体操作。

     

    chrome 中

    Chrome中已经用烂了改伎俩,基本上所有代码中都能看见此手法。

    一个类的内部操作委托给外面的一个对象,通过抽象接口。

    如上面代码所示,MessagePump把  DoWork  DoDelayWork, DoIdelWork通过MessagePump::Deletgate 的接口委托给M essageLoop去处理,这样比较好的解决了代码间的耦合问题。

    类似伎俩在消息系统这块还有很多:

    MessagePump::Watcher           《对应handle的事件处理》

    MessagePump::Observer          《监视Windows消息的处理》 

    MessagePump::Dispatcher         《Windows本地消息的分派》

    MessageLoop::DestructionObserver 《用来跟踪MessageLoop的稀构》

    这些都是委托的接口,只不过名字不像MessagePump::Deletgate这么张扬而已。

    把委托的接口类写到类的内部,

    对于chrome这种写法我是我以前没有考虑过的,

    是个非常清晰的代码风格,

    coder一看就能知道这个委托接口是干吗的

    以上是桥接模式

     

    用PlicyBase的设计方法修改

    template <class Host> class AspectInput { public: void Input() {cout << "MsgInput" << endl;} }; template <clas Host> class AspectOutput { public: void Output() {cout << "Msgoutput" << endl;} }; class Pump: public AspectInput<Pump>, public AspectOutput<Pump> { public: void Run() { Input(); Output(); } }; int main() { Pump pump; pump.Run(); } 

     

     

    最新回复(0)