C++ 如何访问decorator类的方法?
我有下面的程序实现了一个基本的decorator类,但是decorator也有自己的成员函数,我希望可以访问这些函数。在下面的例子中,我想做一些类似finalMouse->rightMouseButton->click()的事情。这种类型的交互甚至可以与装饰师进行,还是另一种设计模式?我在想可能是战略,但这似乎不适用 谢谢C++ 如何访问decorator类的方法?,c++,decorator,C++,Decorator,我有下面的程序实现了一个基本的decorator类,但是decorator也有自己的成员函数,我希望可以访问这些函数。在下面的例子中,我想做一些类似finalMouse->rightMouseButton->click()的事情。这种类型的交互甚至可以与装饰师进行,还是另一种设计模式?我在想可能是战略,但这似乎不适用 谢谢 #include <string> #include <iostream> using namespace std; typedef enum _
#include <string>
#include <iostream>
using namespace std;
typedef enum _location { TOP, SIDE } location;
typedef enum _direction { FORWARD, BACKWARD } direction;
class MouseAbstract
{
public:
virtual string printConfiguration() = 0;
};
class Mouse : public MouseAbstract
{
public:
Mouse(string n) { name = n; };
string printConfiguration() {
return name + " Configuration: ";
}
private:
string name;
};
class MouseConfigurationAddon : public MouseAbstract
{
public:
MouseConfigurationAddon(MouseAbstract* add, location loc, string desc) {
addon = add;
mLocation = loc;
description = desc;
};
string printConfiguration() {
string outLoc = (mLocation == TOP) ? "Location: Top" : "Location: Side";
return addon->printConfiguration() + "\n\nAddon: " + description + ", " + outLoc;
}
protected:
MouseAbstract* addon;
location mLocation;
string description;
};
class Button : public MouseConfigurationAddon
{
public:
Button(MouseAbstract* add, location loc, string desc) : MouseConfigurationAddon(add, loc, desc) {};
string click() {
return description + " has been clicked.";
};
};
class ScrollWheel : public MouseConfigurationAddon
{
public:
ScrollWheel(MouseAbstract* add, location loc, string desc) : MouseConfigurationAddon(add, loc, desc) {};
string spin(direction dir, double rotations) {
string outDir = (mLocation == FORWARD) ? "forward" : "backward";
return description + " has been spun " + outDir + to_string(rotations) + " rotations.";
};
};
int main() {
Mouse* baseMouse = new Mouse("My Gaming Mouse");
Button* rightMouseButton = new Button(baseMouse, TOP, "Right Mouse Button");
Button* leftMouseButton = new Button(rightMouseButton, TOP, "Left Mouse Button");
Button* sideButton1 = new Button(leftMouseButton, SIDE, "Side Button 1");
Button* sideButton2 = new Button(sideButton1, SIDE, "Side Button 2");
ScrollWheel* finalMouse = new ScrollWheel(sideButton2, TOP, "Scroll Wheel");
cout << finalMouse->printConfiguration() << endl;
delete finalMouse;
return 0;
}
#包括
#包括
使用名称空间std;
typedef枚举_位置{TOP,SIDE}位置;
typedef枚举_方向{向前,向后}方向;
类MouseAbstract
{
公众:
虚拟字符串printConfiguration()=0;
};
鼠标类:public MouseAbstract
{
公众:
鼠标(字符串n){name=n;};
字符串printConfiguration(){
返回名称+“配置:”;
}
私人:
字符串名;
};
类MouseConfigurationAddon:PublicMouseAbstract
{
公众:
MouseConfigurationAddon(MouseAbstract*添加、位置定位、字符串描述){
addon=add;
mLocation=loc;
描述=描述;
};
字符串printConfiguration(){
字符串outLoc=(位置==顶部)?“位置:顶部”:“位置:侧面”;
返回加载项->打印配置()+“\n\n加载项:“+description+”,“+outLoc;
}
受保护的:
MouseAbstract*插件;
位置;
字符串描述;
};
类按钮:公共鼠标配置加载项
{
公众:
按钮(MouseAbstract*add,location loc,string desc):MouseConfigurationAddon(add,loc,desc){};
字符串单击(){
已单击“返回说明+”;
};
};
类滚轮:公共鼠标配置加载项
{
公众:
滚轮(MouseAbstract*add,location loc,string desc):MouseConfigurationAddon(add,loc,desc){};
弦旋转(方向定向,双旋转){
字符串outDir=(MLLOCATION==FORWARD)?“FORWARD”:“backward”;
返回说明+“已旋转”+outDir+到字符串(旋转)+“旋转”;
};
};
int main(){
鼠标*baseMouse=新鼠标(“我的游戏鼠标”);
按钮*rightMouseButton=新按钮(底部鼠标,顶部,“鼠标右键”);
按钮*左鼠标按钮=新按钮(右鼠标按钮,顶部,“左鼠标按钮”);
按钮*sideButton1=新按钮(左侧鼠标按钮,侧面,“侧面按钮1”);
按钮*侧按钮2=新按钮(侧按钮1,侧,“侧按钮2”);
ScrollWheel*finalMouse=新的滚轮(侧按钮2,顶部,“滚轮”);
cout printConfiguration()没有设计模式将生成finalMouse->rightMouseButton->click()工作,至少如果你不做<代码> RouthMousButo> <代码> > < Scrollwheel > /Cux>类的成员。基于你实例化的装饰器动态添加数据成员将需要运行时的反映,但是C++甚至没有编译时的反映。如果你不需要在运行时创建配置您可能会得到与使用CRTP类似的结果。无论如何,只调用rightMouseButton->click()
有什么不对?毕竟您已经有了rightMouseButton
变量。这不是Java。不要像那样使用裸new
。这是一种糟糕的做法。编写Mouse baseMouse{“我的游戏鼠标”}
或auto-baseMouse=Mouse{“我的游戏鼠标”}
感谢@Corristo的评论。我学到了一些有趣的东西,你证实了我最初的想法。调用rightMouseButton->click()没有错但从语义上讲,出于可读性的目的,将其称为层次结构的一部分是很好的,但既然不能这样做,那么这将很好地工作