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;
}

2343

被折叠的 条评论
为什么被折叠?



