bridge

本文介绍了一种通过抽象基类实现不同版本绘图功能的方法。具体展示了如何利用多态特性来实现不同版本的绘图功能,包括绘制直线和圆形,并通过具体的例子说明了这种设计模式的应用。

#include <iostream>
using namespace std;
class DP1
{
public:
  static void draw_a_line (double x1, double y1, double x2, double y2)
  {
    cout << "DP1 draw_a_line" << x1 << y1 << x2 << y2 <<endl;
  }
  static void draw_a_circle (double x, double y, double r)
  {
    cout << "DP1 draw_a_circle" << x << y << r << endl;
  }
};
class DP2 {
public:
  static void drawline (double x1, double x2, double y1, double y2)
  {
    cout << "DP2 drawLine" << x1 << y1 << x2 << y2 << endl;
  }
  static void drawcircle (double x, double y, double r)
  {
    cout << "DP2 drawCircle" << x << y << r << endl;
  }
};
class Drawing {
public:
  virtual void drawLine (double x1, double y1, double x2, double y2)=0;
  virtual void drawCircle(double x, double y, double radious) = 0;
};
class V1Drawing : public Drawing
{
public:
  void drawLine (double x1, double y1, double x2, double y2);
  void drawCircle(double x, double y, double r);
};
void V1Drawing::drawLine (double x1, double y1, double x2, double y2)
{
  DP1::draw_a_line(x1,y1,x2,y2);
}
void V1Drawing::drawCircle (double x, double y, double r)
{
  DP1::draw_a_circle (x,y,r);
}
class V2Drawing : public Drawing
{
public:
  void drawLine (double x1, double y1, double x2, double y2);
  void drawCircle(double x, double y, double r);
};
void V2Drawing::drawLine (double x1, double y1, double x2, double y2)
{
  DP2::drawline(x1,x2,y1,y2);
}
void V2Drawing::drawCircle (double x, double y, double r)
{
  DP2::drawcircle(x, y, r);
}
class Shape {
public:
  Shape(Drawing *dp);
  virtual void draw()=0;
  void drawLine(double x1, double y1, double x2, double y2);
  void drawCircle(double x, double y, double r);
private:
  Drawing *_dp;
};
Shape::Shape (Drawing *dp) {
  _dp= dp;
}
void Shape::drawLine(double x1, double y1,
       double x2, double y2)
{
  _dp->drawLine(x1,y1,x2,y2);
}
void Shape::drawCircle(double x, double y, double r)
{
  _dp->drawCircle(x, y, r);
}
class Rectangle:public Shape
{
private:
  double _x1, _y1, _x2, _y2;
  Drawing *dp;
public:
  void draw();
  Rectangle(Drawing *dp, double x1, double y1, double x2, double y2);
 
};
Rectangle::Rectangle (Drawing *dp, double x1, double y1, double x2, double y2) :Shape( dp) {
  _x1= x1; _x2= x2;
  _y1= y1; _y2= y2;
}
void Rectangle::draw () {
  drawLine(_x1,_y1,_x2,_y1);
  drawLine(_x2,_y1,_x2,_y2);
  drawLine(_x2,_y2,_x1,_y2);
  drawLine(_x1,_y2,_x1,_y1);
}
class Circle:public Shape
{
private:
  double _x, _y, _r;
  Drawing *dp;
public:
  void draw();
  Circle (Drawing *dp, double x, double y, double r);
};
Circle::Circle (Drawing *dp, double x, double y, double r) : Shape(dp)
{
  _x= x;
  _y= y;
  _r= r;
}
void Circle::draw () {
  drawCircle( _x, _y, _r);
}

int main() {
  Shape *s1;
  Shape *s2;
  Drawing *dp1, *dp2;
  dp1= new V1Drawing;
  s1=new Rectangle(dp1,1,1,2,2);
  dp2= new V2Drawing;
  s2= new Circle(dp2,2,2,4);
  s1->draw();
  s2->draw();
  delete s1; delete s2;
  delete dp1; delete dp2;
  return 0;
}
// NOTE: Memory management not tested.
// Includes not shown.

// We have been given the implementations for
// DP1 and DP2

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值