c++设计模式之桥模式


视频地址:

https://www.ixigua.com/6804249883344634380?id=6803643064515559944

文档整理地址:

http://t.csdn.cn/mrdWP

重构前类图:

 重构前样例代码:

  1 class Messager {
  2 public:
  3     virtual void Login(string username, string password) = 0;
  4     virtual void SendMessage(string message) = 0;
  5     virtual void SendPicture(Image image) = 0;
  6 
  7     virtual void PlaySound() = 0;
  8     virtual void DrawShape() = 0;
  9     virtual void WriteText() = 0;
 10     virtual void Connect() = 0;
 11 
 12     virtual ~Messager() {}
 13 };
 14 
 15 //平台实现
 16 
 17 class PCMessagerBase : public Messager {
 18 public:
 19 
 20     virtual void PlaySound() {
 21         //**********
 22     }
 23     virtual void DrawShape() {
 24         //**********
 25     }
 26     virtual void WriteText() {
 27         //**********
 28     }
 29     virtual void Connect() {
 30         //**********
 31     }
 32 };
 33 
 34 class MobileMessagerBase : public Messager {
 35 public:
 36 
 37     virtual void PlaySound() {
 38         //==========
 39     }
 40     virtual void DrawShape() {
 41         //==========
 42     }
 43     virtual void WriteText() {
 44         //==========
 45     }
 46     virtual void Connect() {
 47         //==========
 48     }
 49 };
 50 
 51 //业务抽象
 52 
 53 class PCMessagerLite : public PCMessagerBase {
 54 public:
 55 
 56     virtual void Login(string username, string password) {
 57 
 58         PCMessagerBase::Connect();
 59         //........
 60     }
 61     virtual void SendMessage(string message) {
 62 
 63         PCMessagerBase::WriteText();
 64         //........
 65     }
 66     virtual void SendPicture(Image image) {
 67 
 68         PCMessagerBase::DrawShape();
 69         //........
 70     }
 71 };
 72 
 73 
 74 
 75 class PCMessagerPerfect : public PCMessagerBase {
 76 public:
 77 
 78     virtual void Login(string username, string password) {
 79 
 80         PCMessagerBase::PlaySound();
 81         //********
 82         PCMessagerBase::Connect();
 83         //........
 84     }
 85     virtual void SendMessage(string message) {
 86 
 87         PCMessagerBase::PlaySound();
 88         //********
 89         PCMessagerBase::WriteText();
 90         //........
 91     }
 92     virtual void SendPicture(Image image) {
 93 
 94         PCMessagerBase::PlaySound();
 95         //********
 96         PCMessagerBase::DrawShape();
 97         //........
 98     }
 99 };
100 
101 class MobileMessagerLite : public MobileMessagerBase {
102 public:
103 
104     virtual void Login(string username, string password) {
105 
106         MobileMessagerBase::Connect();
107         //........
108     }
109     virtual void SendMessage(string message) {
110 
111         MobileMessagerBase::WriteText();
112         //........
113     }
114     virtual void SendPicture(Image image) {
115 
116         MobileMessagerBase::DrawShape();
117         //........
118     }
119 };
120 
121 class MobileMessagerPerfect : public MobileMessagerBase {
122 public:
123 
124     virtual void Login(string username, string password) {
125 
126         MobileMessagerBase::PlaySound();
127         //********
128         MobileMessagerBase::Connect();
129         //........
130     }
131     virtual void SendMessage(string message) {
132 
133         MobileMessagerBase::PlaySound();
134         //********
135         MobileMessagerBase::WriteText();
136         //........
137     }
138     virtual void SendPicture(Image image) {
139 
140         MobileMessagerBase::PlaySound();
141         //********
142         MobileMessagerBase::DrawShape();
143         //........
144     }
145 };
146 
147 void Process() {
148     //编译时装配
149     Messager* m = new MobileMessagerPerfect();
150 }

重构后类图:

 重构后样例代码:

  1 class Messager {
  2 protected:
  3     MessagerImp* messagerImp;//...
  4 public:
  5     virtual void Login(string username, string password) = 0;
  6     virtual void SendMessage(string message) = 0;
  7     virtual void SendPicture(Image image) = 0;
  8 
  9     virtual ~Messager() {}
 10 };
 11 
 12 class MessagerImp {
 13 public:
 14     virtual void PlaySound() = 0;
 15     virtual void DrawShape() = 0;
 16     virtual void WriteText() = 0;
 17     virtual void Connect() = 0;
 18 
 19     virtual MessagerImp() {}
 20 };
 21 
 22 //平台实现 n
 23 class PCMessagerImp : public MessagerImp {
 24 public:
 25 
 26     virtual void PlaySound() {
 27         //**********
 28     }
 29     virtual void DrawShape() {
 30         //**********
 31     }
 32     virtual void WriteText() {
 33         //**********
 34     }
 35     virtual void Connect() {
 36         //**********
 37     }
 38 };
 39 
 40 class MobileMessagerImp : public MessagerImp {
 41 public:
 42 
 43     virtual void PlaySound() {
 44         //==========
 45     }
 46     virtual void DrawShape() {
 47         //==========
 48     }
 49     virtual void WriteText() {
 50         //==========
 51     }
 52     virtual void Connect() {
 53         //==========
 54     }
 55 };
 56 
 57 //业务抽象 m
 58 
 59 //类的数目:1+n+m
 60 
 61 class MessagerLite :public Messager {
 62 
 63 
 64 public:
 65 
 66     virtual void Login(string username, string password) {
 67 
 68         messagerImp->Connect();
 69         //........
 70     }
 71     virtual void SendMessage(string message) {
 72 
 73         messagerImp->WriteText();
 74         //........
 75     }
 76     virtual void SendPicture(Image image) {
 77 
 78         messagerImp->DrawShape();
 79         //........
 80     }
 81 };
 82 
 83 
 84 class MessagerPerfect :public Messager {
 85 
 86 
 87 public:
 88 
 89     virtual void Login(string username, string password) {
 90 
 91         messagerImp->PlaySound();
 92         //********
 93         messagerImp->Connect();
 94         //........
 95     }
 96     virtual void SendMessage(string message) {
 97 
 98         messagerImp->PlaySound();
 99         //********
100         messagerImp->WriteText();
101         //........
102     }
103     virtual void SendPicture(Image image) {
104 
105         messagerImp->PlaySound();
106         //********
107         messagerImp->DrawShape();
108         //........
109     }
110 };
111 
112 void Process() {
113     //运行时装配
114     MessagerImp* mImp = new PCMessagerImp();
115     Messager* m = new Messager(mImp);
116 }