|
@@ -0,0 +1,74 @@
|
|
|
+//桥接模式,对面向对象的进一步封装
|
|
|
+#include<iostream>
|
|
|
+#include<cstring>
|
|
|
+
|
|
|
+
|
|
|
+//从最简单的Pimpl模式开始说起
|
|
|
+//在Pimpl类中定义了一个类内结构体,所有的数据全部存储在类内结构体中
|
|
|
+//在Pimpl中的函数的作用就是作为bridge将point中的函数对外暴露出来
|
|
|
+class Pimpl
|
|
|
+{
|
|
|
+private:
|
|
|
+ struct point;
|
|
|
+ point* data;
|
|
|
+
|
|
|
+public:
|
|
|
+ Pimpl(int _x,int _y);
|
|
|
+ Pimpl(const Pimpl& copy);
|
|
|
+ Pimpl& operator=(const Pimpl& copy);
|
|
|
+
|
|
|
+ ~Pimpl();
|
|
|
+
|
|
|
+ int caculater();
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
+struct Pimpl::point
|
|
|
+{
|
|
|
+ int x;
|
|
|
+ int y;
|
|
|
+ point(int _x,int _y):x(_x),y(_y)
|
|
|
+ {}
|
|
|
+ int caculater()
|
|
|
+ {
|
|
|
+ return (x+y)/2;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+Pimpl::Pimpl(int _x,int _y)
|
|
|
+{
|
|
|
+ data=new point(_x,_y);
|
|
|
+}
|
|
|
+
|
|
|
+Pimpl::Pimpl(const Pimpl ©)
|
|
|
+{
|
|
|
+ void* memory=new char[sizeof(point)]; //实现深拷贝
|
|
|
+ std::memcpy(memory,copy.data,sizeof(point));
|
|
|
+ this->data=static_cast<point*>(memory); //void*转换为某种类型的指针不会打破完全别名规则
|
|
|
+}
|
|
|
+
|
|
|
+Pimpl& Pimpl::operator=(const Pimpl& copy)
|
|
|
+{
|
|
|
+ this->data=copy.data;
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Pimpl::~Pimpl()
|
|
|
+{
|
|
|
+ delete data;
|
|
|
+}
|
|
|
+
|
|
|
+int Pimpl::caculater()
|
|
|
+{
|
|
|
+ return data->caculater();
|
|
|
+}
|
|
|
+
|
|
|
+//桥接模式的代码这里就不实现了
|
|
|
+//桥接模式的核心就是将多个类放入桥接器,然后通过桥接器暴露接口
|
|
|
+//(桥接器实际上就是Pimpl的扩展,在Pimpl中只有一个类,但是桥接模式是可以扩展多个类的)
|
|
|
+
|
|
|
+
|
|
|
+int main()
|
|
|
+{
|
|
|
+ Pimpl test(1,2);
|
|
|
+}
|