软件设计模式之访问者模式(C++)

1、

在这里插入图片描述

2、实现代码示例

#include <iostream>
#include <string>

using namespace std;

class Visitor;

class Animal {     //Element抽象节点,定义一个Accept操作,以一个访问者为参数;此处猫狗例子并不合适,因为不是稳定结构,
	               //可能有猪鸭或更多动物。例如人性别只有男、女一样为稳定
public:
	virtual void Accept(Visitor* visitor) = 0;   //Accept 方法表示接受访问者的访问,由子类具体实现
};

class Dog : public Animal {    //ConcretrElement具体元素,实现Accept操作
public:
	void Accept(Visitor* visitor);
	void Operarion() {};   //其他操作
};

class Cat : public Animal {   //ConcretrElement具体元素
public:
	void Accept(Visitor * visitor);
};


class Visitor {  //Visitor 抽象访问者,声明多个访问操作,为ConcretrElement每一个类声明一个visit操作,传入不同的实现类,可访问不同的数据
public:
	virtual void visitDog(Dog * dog) = 0;
	virtual void visitCat(Cat * cat) = 0;
};

class GrowlVisitor : public Visitor {   //ConcentrateVisiter具体访问者,实现Visitor声明的访问操作
public:
	void visitDog(Dog * dog) {
		cout << "wang" << endl;
	}

	void visitCat(Cat * cat) {
		cout << "miao" << endl;
	}
};

class YellVisitor : public Visitor {   //ConcentrateVisiter具体访问者
public:

	void visitDog(Dog * dog) {
		cout << "wang~wang~wang~" << endl;
	}

	void visitCat(Cat * cat) {
		cout << "miao~miao~miao~" << endl;
	}
};


void Dog::Accept(Visitor* visitor) {
	visitor->visitDog(this);
}

void Cat::Accept(Visitor* visitor) {
	visitor->visitCat(this);
}


class ObjectStructure {   //ObjectStructure结构对象,可遍历结构中所有元素。可提供一个高层次接口让访问者对象可以
	                      //访问每一个元素,可设计成一个复合对象或一个聚集,如list、set
public:
	ObjectStructure(Animal* animal) {
		panimal = animal;
	};

	void ObjectStructureA() {
		GrowlVisitor growlvisitor;
		panimal->Accept(&growlvisitor);
	}

	void ObjectStructureB() {
		YellVisitor yellvisitor;
		panimal->Accept(&yellvisitor);
	}
private:
	Animal* panimal;
};

int main() {    //Client客户端代码
	Dog dog;
	ObjectStructure objS01(&dog);
	objS01.ObjectStructureA();
	objS01.ObjectStructureB();

	Cat cat;
	ObjectStructure objS02(&cat);
	objS02.ObjectStructureA();
	objS02.ObjectStructureB();

	return 0;
}

以上代码的猫狗动物叫声的例子是参考知乎一位java大佬,因为贴切且容易理解,但代码是自己写的

3、程序设计原则

①单一职责原则

就一个类而言,应该仅有一个引起它变化的原因。
避免一个类负责多个功能的实现,当发生更改时影响其他功能而致使复用成为不可能。

②里氏替换原则

派生类(子类)对象能够替换其基类(父类)对象被调用。
即在程序中,任何调用基类对象实现的功能,都可以调用派生类对象来替换。

③依赖倒置原则

高层模块不应该依赖于低层模块,它们应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
即接口编程思想,接口是稳定的,实现是不稳定的,一旦接口确定,就不应该再进行修改了。根据接口的实现,是可以根据具体问题和情况,采用不同的手段去实现。

④接口隔离原则

指用多个专门的接口,而不使用单一的总接口,不要依赖不需要的东西。类间的依赖关系应该建立在最小的接口之上,接口中的方法尽量少(不是越少越好,一定要适度)。经常提到的降低耦合,降低依赖,主要也是通过这个原则来达到的

⑤迪米特法则

每一个类都应尽量降低成员的访问权限,一个实体应当尽可能少的与其他实体之间发生相互作用。

⑥开闭原则

程序的设计应该是不约束扩展,即扩展开放,但又不能修改已有功能,即修改关闭。当软件需求发生变化时,应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码

⑦组合/聚合复用原则

当要扩展类的功能时,优先考虑使用组合,而不是继承。

三、简述其他设计模式

①单例模式

单例对象的类只能允许一个实例存在。
类自身保存它的唯一实例,保证不被创建其他实例,且提供访问该实例的方法
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值