我想检查以下示例(来自测试面试)是否与正确的设计模式名称相对应:
示例1:该段代码可以说明" Builder"模式或它可能是"策略"一个?
FileStream* files = new FileStream("my_file.zip");
BufferedStream* bufferds = new BufferedStream(files);
ZipStream* zips = new ZipStream(bufferds);
示例2:以下代码代表"策略"模式?
struct UnixText {
void write(string str) { cout << str; }
void lf() { cout << "\n"; }
};
struct WindowsText {
void write(string str) { cout << str; }
void crlf() { cout << "\r\n"; }
};
struct Writer {
virtual void write(string str) = 0;
virtual void newline() = 0;
virtual ~Writer() {}
};
struct UnixWriter : Writer {
UnixWriter(UnixText* tx) { _target = tx; }
virtual void write(string str) { _target->write(str); }
virtual void newline() { _target->lf(); }
private:
UnixText* _target;
};
struct WindowsWriter : Writer {
WindowsWriter(WindowsText* tx) { _target = tx; }
virtual void write(string str) { _target->write(str); }
virtual void newline() { _target->crlf(); }
private:
WindowsText* _target;
};
int main()
{
Writer* writer = (g_IsUnix) ? (Writer*) new UnixWriter(new UnixText()) : (Writer*) new WindowsWriter(new WindowsText());
writer->write("Hello");
writer->newline();
writer->write("World");
}
答案 0 :(得分:1)
第一个示例使用I / O流,它很好地使用了Decorator
模式。这里有一个构造函数,它接受相同抽象类或接口的实例。这是Decorator
模式
第二个,您正在将一些写作Strategy
传递给作为上下文的UnixWriter
和WindowsWriter
。因此可以将其视为Strategy
模式。但你仍然可以通过签订写作策略合同来改善它。所以你的具体作者应该只知道那种超级类型,而不是引用具体的实现。这将使您的系统更加灵活。