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、程序设计原则
①单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。
避免一个类负责多个功能的实现,当发生更改时影响其他功能而致使复用成为不可能。
②里氏替换原则
派生类(子类)对象能够替换其基类(父类)对象被调用。
即在程序中,任何调用基类对象实现的功能,都可以调用派生类对象来替换。
③依赖倒置原则
高层模块不应该依赖于低层模块,它们应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
即接口编程思想,接口是稳定的,实现是不稳定的,一旦接口确定,就不应该再进行修改了。根据接口的实现,是可以根据具体问题和情况,采用不同的手段去实现。
④接口隔离原则
指用多个专门的接口,而不使用单一的总接口,不要依赖不需要的东西。类间的依赖关系应该建立在最小的接口之上,接口中的方法尽量少(不是越少越好,一定要适度)。经常提到的降低耦合,降低依赖,主要也是通过这个原则来达到的
⑤迪米特法则
每一个类都应尽量降低成员的访问权限,一个实体应当尽可能少的与其他实体之间发生相互作用。
⑥开闭原则
程序的设计应该是不约束扩展,即扩展开放,但又不能修改已有功能,即修改关闭。当软件需求发生变化时,应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码
⑦组合/聚合复用原则
当要扩展类的功能时,优先考虑使用组合,而不是继承。
三、简述其他设计模式
①单例模式
单例对象的类只能允许一个实例存在。
类自身保存它的唯一实例,保证不被创建其他实例,且提供访问该实例的方法