如何设计对象以不同方式设置文本格式
How to design an object to format text in different ways
我有一个项目,可以根据应用程序所处的某些状态和模式打印一些数据。
enum Mode {
mode1 = 0,
mode2
};
enum State {
state1 = 0,
state2
};
数据可以通过多种方式打印,以下是一些示例:
1. name1 value1 name2 value2 name3 value3
2. value1 value2 value3
3. name1 : value1.
name2 : value2
name3 : value3
我试图用 ostream 运算符重载创建一个类:
class Formater {
public:
Formater(.....) { ... } // pass name, value, mode, state here.
virtual void print_State1_Mode1(ostream& os) { }
virtual void print_State1_Mode2(ostream& os) { }
virtual void print_State2_Mode1(ostream& os) { }
virtual void print_State2_Mode2(ostream& os) { }
friend std::ostream& operator << (std::ostream& os, const Formater& f) {
if (state1 & mode1) {
print_State1_Mode1(os);
}
else if(state1 & mode2) {
print_State1_Mode2(os);
}
else if(state2 & mode1) {
print_State2_Mode1(os);
}
else {
print_State2_Mode2(os);
}
return os;
}
};
这将用于某些命令,并且每个命令(取决于状态和模式(可以具有不同的格式来打印文本。
因此,如果我的对象无法满足命令,我会从它继承并创建一个新命令并覆盖其中一个虚拟方法,具体取决于我需要新格式的模式和状态。
所以我最终可以得到更多的格式化器对象(格式化器1,格式化器2....(。
我对这种方法不是 100% 满意。有没有人有更好的设计或我可以改进当前设计的方法?
我不
明白为什么这个简单的设计是不够的。
class Formatter {
...
virtual std::ostream& insert(std::ostream&) const = 0;
friend std::ostream& operator<<(std::ostream& os, const Formatter& fmt) {
return fmt.insert(os);
}
};
class Formatter_State1_Mode1: public Formatter {
...
std::ostream& insert(std::ostream&) const override;
};
class Formatter_State1_Mode2: public Formatter {
...
std::ostream& insert(std::ostream&) const override;
};
Formatter* makeFormatter(Mode, State, ...);
它摆脱了丑陋的 if-else-ladder 并产生更好的性能。
我建议你在这里使用Bridge
模式。为此,您的功能应仔细分解为两部分。所以你的状态应该是抽象的或精炼的抽象。Formatter
将是Implementor
.然后,您可以将不同的格式化程序作为ConcreteImplementors
。您可以使用AbstractFactory
说FormatterFactory来获取基于某些配置属性的格式化程序。这个逻辑应该由你自己定义。
这是Gang of Four
Bridge Pattern
定义:将抽象与其实现分离,以便两者可以独立变化。
相关文章:
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 如何在C++中以这种方式返回一行文本?
- 以原子方式将彩色文本写入 Windows 中的控制台
- 为Catch2中的外部文本文件指定路径的最佳方式
- 内置用于比较两个(或多个)值的方式
- 我想重置一个C++结构统计,我可以以某种方式使用 stat() 语法吗?
- 迭代文本对的最佳方式
- 如何设计对象以不同方式设置文本格式
- 如何以原子方式重置shared_ptr
- 在Linux中寻找正确的方式,将C 应用程序从C 应用程序编写加密文本到加密的GPG文件
- 在Qt中以高性能方式将(富)文本附加到QTextEdit或QTextBrowser中
- 重置类的最优雅方式
- 即使不满足条件,也会重置文本文件.(C++)
- 以编程方式在 IE 中设置页面缩放和文本大小
- 读取文本文件而不占用内存的最佳方式
- wxWidgets工具栏文本对齐方式
- 在 Vtk 中显示 3D 文本的最佳方式是什么
- 如何在Qt QML中以声明性方式更改文本的颜色
- 以随机访问方式更改文本文件