The Bridge Pattern C++实现
来源:互联网 发布:caj转换word软件 编辑:程序博客网 时间:2024/06/06 20:42
Summary: One Rule, One place
A very important rule to follow is there is only one place to have where you implement a rule.
当需要改变一个规则的时候,只有在一个地方进行修改,才能尽可能减少出错的可能性。
当抽象类和它的实现都有可能变化的时候,我们将这实现分离出来,即封装实现的具体内容来避免随着修改的进行而出现类爆炸的情况,并且能够实现低耦合和高内聚。
这里还有设计最基本的规则就是:
1、找出哪些是变化的并封装这些变化
2、多用组合而少用继承
3 对接口进行设计
对于本章中的例子来说,开始的设计如下:
缺点:当增加一个Shape的时候,都需要修改,需要重新增加一个子类,并且还都要实现如何来画这个Shape的代码。当增加一个DP3的时候,需要对所用现有的Shape都要增加关于V3XXX的实现,而且随着增加,会出现类爆炸式的增长。
运用Bridge模式,首先找出哪些是有可能变化的,在这里是Shape和Draw的实现方式,首先抽象出两个类:
第二步,确定这些变化
第三步, 确定谁应该用谁
第四步 扩展这些类
下面是该模式的C++的实现
#include <iostream.h>
#include <stdio.h>
class DP1
{
public:
static void Draw_a_Line()
{
cout<<"DP1 is drawing line"<<endl;
};
static void Draw_a_Circle()
{
cout<<"DP1 is drawing circle"<<endl;
};
};
class DP2
{
public:
static void DrawLine()
{
cout<<"DP2 is drawing line"<<endl;
};
static void DrawCircle()
{
cout<<"DP2 is drawing circle"<<endl;
};
};
class Drawing{
public:
virtual void DrawLine()=0;
virtual void DrawCircle()=0;
};
class Shape{
public:
Shape(Drawing *_dp){dp=_dp;};
public:
virtual void Draw()=0;
private:
Drawing* dp;
protected:
void DrawLine(){dp->DrawLine();};
void DrawCircle(){dp->DrawCircle();};
};
class Rect:public Shape
{
public:
Rect(Drawing* _dp);
public:
void Draw(){DrawLine();};
};
Rect::Rect(Drawing* _dp):Shape(_dp)
{
}
class Circle:public Shape
{
public:
Circle(Drawing* _dp);
void Draw(){DrawCircle();};
};
Circle::Circle(Drawing* _dp):Shape(_dp)
{
}
class V1Drawing:public Drawing{
private:
DP1 dp;
public:
void DrawLine(){
dp.Draw_a_Line();
};
void DrawCircle(){
dp.Draw_a_Circle();
};
};
class V2Drawing:public Drawing{
private:
DP2 dp;
public:
void DrawLine(){
dp.DrawLine();
};
void DrawCircle(){
dp.DrawCircle();
};
};
void main()
{
Shape* s1,*s2;
Drawing* d1,*d2;
d1=new V1Drawing();
d2=new V2Drawing();
s1=new Rect(d1);
s1->Draw();
delete s1;
s1=new Rect(d2);
s1->Draw();
s2=new Circle(d1);
s2->Draw();
delete s2;
s2=new Circle(d2);
s2->Draw();
getchar();
delete s1;
delete s2;
delete d1;
delete d2;
}
#include <stdio.h>
class DP1
{
public:
static void Draw_a_Line()
{
cout<<"DP1 is drawing line"<<endl;
};
static void Draw_a_Circle()
{
cout<<"DP1 is drawing circle"<<endl;
};
};
class DP2
{
public:
static void DrawLine()
{
cout<<"DP2 is drawing line"<<endl;
};
static void DrawCircle()
{
cout<<"DP2 is drawing circle"<<endl;
};
};
class Drawing{
public:
virtual void DrawLine()=0;
virtual void DrawCircle()=0;
};
class Shape{
public:
Shape(Drawing *_dp){dp=_dp;};
public:
virtual void Draw()=0;
private:
Drawing* dp;
protected:
void DrawLine(){dp->DrawLine();};
void DrawCircle(){dp->DrawCircle();};
};
class Rect:public Shape
{
public:
Rect(Drawing* _dp);
public:
void Draw(){DrawLine();};
};
Rect::Rect(Drawing* _dp):Shape(_dp)
{
}
class Circle:public Shape
{
public:
Circle(Drawing* _dp);
void Draw(){DrawCircle();};
};
Circle::Circle(Drawing* _dp):Shape(_dp)
{
}
class V1Drawing:public Drawing{
private:
DP1 dp;
public:
void DrawLine(){
dp.Draw_a_Line();
};
void DrawCircle(){
dp.Draw_a_Circle();
};
};
class V2Drawing:public Drawing{
private:
DP2 dp;
public:
void DrawLine(){
dp.DrawLine();
};
void DrawCircle(){
dp.DrawCircle();
};
};
void main()
{
Shape* s1,*s2;
Drawing* d1,*d2;
d1=new V1Drawing();
d2=new V2Drawing();
s1=new Rect(d1);
s1->Draw();
delete s1;
s1=new Rect(d2);
s1->Draw();
s2=new Circle(d1);
s2->Draw();
delete s2;
s2=new Circle(d2);
s2->Draw();
getchar();
delete s1;
delete s2;
delete d1;
delete d2;
}
- The Bridge Pattern C++实现
- The Bridge Pattern
- Design Pattern - Bridge(C#)
- 设计模式实现(七): Bridge Pattern
- C++实现设计模式:Bridge Pattern
- Bridge Pattern
- Bridge pattern
- Bridge Pattern
- Bridge Pattern
- Bridge Pattern
- Bridge Pattern
- Bridge Pattern
- Bridge Pattern
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
- (C++实现)——桥模式(Bridge Pattern)
- Java实现(07)——桥接模式(Bridge Pattern)
- Design Pattern 14-bridge
- Bridge Pattern(桥模式)
- DT问与答
- 关于ODBC数据源连接文本
- 区间算术及原型代码(C++)
- 联机丛书:删除存储过程
- 联机丛书:查看存储过程
- The Bridge Pattern C++实现
- 在Google“读书” Google大学免费开学
- 联机丛书:存储过程及其创建
- 性能调优1
- 删除a表中和b表相同的数据
- 在ORCAL中实现的复制
- 解密SQL2000的存储过程
- SQLSERVER打补丁后的版本号
- 调优日志切换(TuningLogSwitches)