组件聚合思路的剥离部分

代码仅仅为明确思路,可能有错误和不完善的地方,:)

#include <iostream>

using namespace std;

class IUnkonwn

{

      public:

            virtual void qdisp1(int IID,void**ptr)=0;

};

class NotIUnkonwn

{

       public:

            virtual void Notqdisp1(int IID,void**ptr)=0;

};

class CIX:public IUnkonwn

{

      public:

      virtual void IX()=0;

};

 

/

class CIY:public IUnkonwn

{

      public:

      virtual void IY()=0;

};

//

class CIZ:public IUnkonwn

{

      public:

      virtual void IZ()=0;

};

///

class ca:public CIY,CIZ,NotIUnkonwn //component ca

{

public:

   ca(IUnkonwn *p_IUnkonwn)//将外部组件传入 ,那么被聚合的接口调用 qdisp1将是调用外部组件的 qdisp1,防止通过被聚合的接口暴露内部组件的其他接口

   {

        p_IUnkonwn_cb=p_IUnkonwn;

   }

   ~ca()

   {

        cout<<"~ca()"<<endl;

   }

   virtual void Notqdisp1(int IID,void**ptr)

   {

          if(0==IID)

          {

             *ptr=(NotIUnkonwn *)this;

             cout<<"p_IUnkonwn_ca被转化为 PNotIUnkonwn类型"<<endl;

             return; 

          }

          else

          {

             if(1==IID)

             {

                       *ptr=(CIY *)this;

                       cout<<"Notqdisp1返回CAIY "<<endl;

                       return;

             }

             if(2==IID)

             {

                       *ptr=(CIZ *)this;

                       return;

             }

         

          }

         *ptr=NULL;

          return;

   };

   virtual void qdisp1(int IID,void**ptr)

   {

           p_IUnkonwn_cb->qdisp1(IID,ptr);

   }

   IUnkonwn *p_IUnkonwn_cb;

public:

   virtual void IY(){cout<<"ca:IY"<<endl;} 

   virtual void IZ(){cout<<"ca:IZ"<<endl;}

};

/

///

class cb:public CIX //component cb 取得CA组件的IY接口但不暴露 IZ接口

{

   public:

   cb()

   {

        ca *pca=new ca(this);//初始化了 p_IUnkonwn_cb那么在返回的IY中调用 qdisp1将会使用CB qdisp1

        pca->Notqdisp1(0,(void **)&p_IUnkonwn_ca); //p_IUnkonwn_ca被转化为 PNotIUnkonwn类型

       

   }

    ~cb()

   {

        cout<<"~cb()"<<endl;

   }

   virtual void qdisp1(int IID,void**ptr)

   {

          if(0==IID)

          {

             *ptr=(IUnkonwn *)this;

             return; 

          }

          else

          {

             if(1==IID)

             {

                       *ptr=(CIX *)this;

                       return;

             }

             if(2==IID)

             {

                       p_IUnkonwn_ca->qdisp1(1,ptr);   //关键部分 PNotIUnkonwn调用了 qdisp1

                       cout<<"//实际调用为Notqdisp1返回CAIY "<<endl;

                       return;

             }

          }  

         

          *ptr=NULL;

          return;

   };

   virtual void IX(){cout<<"cb:IX"<<endl;}

   private:

         IUnkonwn *p_IUnkonwn_ca;

  

};

int main()

{

 

   cb *pcb=new cb;

   CIY * PIY;

   pcb->qdisp1(2,(void**)&PIY);

   if(PIY!=NULL)

   PIY->IY();

   /

   //试图通过PIY找到组件CA的其他接口

   CIZ * PIZ;

   PIY->qdisp1(1,(void**)&PIZ);

   PIZ->IZ(); //使用的为CB qdisp1成功屏蔽掉了IZ

  

   cin.get();

}

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值