C++面向对象编程分享10----观察者模式
来源:互联网 发布:淘宝店铺封面大全图片 编辑:程序博客网 时间:2024/05/16 11:01
visitor.h
#include <iostream>using namespace std;class Visitor;class Shape{public:// drawSystme为已确知需要的方法virtual void draw() = 0;// 通过下面的accept方法,为Shape的子类增加一个或多个方法virtual void accept(Visitor *visitor) = 0;public:virtual ~Shape(){cout << "Destructor of Shape" << endl;}};class Rectangle : public Shape{public:void draw();void accept(Visitor *visitor);public:~Rectangle(){cout << "Destructor of Rectangle" << endl;}};class Circle : public Shape{public:void draw();void accept(Visitor *visitor);public:~Circle(){cout << "Destructor of Circle" << endl;}};class Line : public Shape{public:void draw();void accept(Visitor *visitor);public:~Line(){cout << "Destructor of Line" << endl;}};class Visitor{public:virtual void visit(Rectangle *shape) = 0;virtual void visit(Circle *shape) = 0;virtual void visit(Line *shape) = 0;public:virtual ~Visitor(){cout << "Destructor of Visitor" << endl;}};class FillVisitor : public Visitor{public:void visit(Rectangle *shape){cout << "added Fill() method for Rectangle" << endl;}void visit(Circle *shape){cout << "added Fill() method for Circle." << endl;}void visit(Line *shape){cout << "added Fill() method for Line." << endl;}public:~FillVisitor(){cout << "Destructor of FillVisitor" << endl;}};class AddTextVisitor : public Visitor{public:void visit(Rectangle *shape){cout << "added AddText() method for Rectangle" << endl;}void visit(Circle *shape){cout << "added AddText() method for Circle" << endl;}void visit(Line *shape){cout << "added AddText() method for Line" << endl;}public:~AddTextVisitor(){cout << "Destructor of AddTextVisitor" << endl;}};// Visitor.cpp#include "visitor.h"void Rectangle::draw(){cout << "Rectangle::draw()" << endl;}void Rectangle::accept(Visitor *visitor){visitor->visit(this); }void Circle::draw(){cout << "Circle::draw()" << endl;}void Circle::accept(Visitor *visitor){visitor->visit(this); }visitor.cpp
#include "visitor.h"int main(){Visitor *visitor1 = new FillVisitor();Shape *rectangle = new Rectangle();rectangle->draw();rectangle->accept(visitor1);Shape *circle = new Circle();rectangle->draw();circle->accept(visitor1);cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;Visitor *visitor2 = new AddTextVisitor();rectangle->accept(visitor2);circle->accept(visitor2);cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;delete visitor1;delete visitor2;delete rectangle;delete circle;system("pause");return 0;}
观察者模式的基本结构如下:
首先,shape先留个方法,可以接入新的内容,里面的参数是Visitor接口, Visitor有visit方法,有各种类继承Visitor,也就是继承visit方法。
而调用时,可以用Rec::accept(Visitor* ),定义域来具体实现shape下的各个类方法。
1 0
- C++面向对象编程分享10----观察者模式
- php面向对象编程 – 观察者模式
- 面向对象编程思想-观察者模式
- 面向对象编程思想-观察者模式
- PHP面向对象编程设计模式(四)观察者模式
- 浅谈面向对象设计模式:观察者模式
- 从观察者模式到面向对象-以小见大
- 面向对象----观察者模式(示例)
- Android编程思想,面向对象程序设计第三篇——观察者模式
- 我中意的C面向对象编程模式
- 面向对象的设计模式(七),观察者模式
- C++面向对象编程分享09----20160429_设计模式_李楚煌
- C语言面向对象编程
- C语言面向对象编程
- C语言面向对象编程
- C语言面向对象编程
- C的面向对象编程
- C语言面向对象编程
- 标识符、关键字和Java程序的基本规则
- 固定fotter
- Git 基本命令
- 关于单例模式的一些讨论(实现单例模式)
- 二叉搜索树与双向链表
- C++面向对象编程分享10----观察者模式
- 新博客地址
- SpringBoot优化内嵌的Tomcat
- javascript 手机号码正则表达式验证函数
- iOS使用Object-C自定义cordova插件(二)
- Nginx+tomcat负载均衡配置
- shell 中的单行注释和多行注释
- How to install Nvidia drivers in Ubuntu 13.04
- Bloom Filter(布隆过滤器)