桥接模式
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。
实现
我们有一个作为桥接实现的 DrawAPI 接口和实现了 DrawAPI 接口的实体类 RedCircle、GreenCircle。Shape 是一个抽象类,将使用 DrawAPI 的对象。BridgePatternDemo,我们的演示类使用 Shape 类来画出不同颜色的圆。
示例代码;
Shape.h
#pragma once
class DrawAPI;
class Shape
{
public:
DrawAPI *drawAPI;
Shape(DrawAPI* pDrawAPI);
virtual void draw() = 0;
};
class Circle :public Shape
{
private:
int x;
int y;
int radius;
public:
Circle(int ptx, int pty, int r, DrawAPI * pDrawAPI);
void draw();
};
shape.cpp
#include "Shape.h"
#include "DrawAPI.h"
Shape::Shape(DrawAPI* pDrawAPI):
drawAPI(pDrawAPI)
{
}
Circle::Circle(int ptx, int pty, int r, DrawAPI * pDrawAPI):Shape(pDrawAPI)
{
x = ptx;
y = pty;
this->radius = r;
}
void Circle::draw()
{
drawAPI->drawCircle(radius, x, y);
}
DrawAPI.h
#pragma once
class DrawAPI
{
public:
virtual void drawCircle(int r, int x, int y) = 0;
};
class RedCircle :public DrawAPI
{
public:
virtual void drawCircle(int r, int x, int y);
};
class GreenCircle :public DrawAPI
{
public:
virtual void drawCircle(int r, int x, int y);
};
DrawAPI.cpp
#include "DrawAPI.h"
#include <stdio.h>
void RedCircle::drawCircle(int r, int x, int y)
{
printf("RedCircle::drawCircle(%d,%d,%d)\n", x, y,r);
}
void GreenCircle::drawCircle(int r, int x, int y)
{
printf("GreenCircle::drawCircle(%d,%d,%d)\n", x, y,r);
}
main.cpp
#include "DrawAPI.h"
#include "Shape.h"
#include <stdio.h>
void main()
{
Shape *pShape1 = new Circle(1, 2, 3, new RedCircle);
pShape1->draw();
Shape *pShape2 = new Circle(4, 5, 6, new GreenCircle);
pShape2->draw();
getchar();
}
输出结果:
RedCircle::drawCircle(1,2,3)
GreenCircle::drawCircle(4,5,6)