动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知,如果
动机(Motivation)
- 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知,如果这样的依赖关系过于紧密,将是软件不能很好地抵御变化。
- 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系,从而实现软件结构的松耦合。
code
FileSplitter.cpp
class FileSplitter { string m_filePath; int m_fileNumber; public: FileSplitter(const string& filePath, int fileNumber) :m_filePath(filePath), m_fileNumber(fileNumber) { //... } void split() { //1.读取大文件 //2.分批次向小文件中写入 for (int i = 0; i < m_fileNumber; i++) { //.. } } };
MainForm.cpp
class MainForm :public Form
{
TextBox* txtFilePath;
TexBox* texFileNumber;
public:
void Button1_Click() {
string txtPath = txtFilePath->getText();
int number = atol(texFileNumber->getText().c_str());
FileSplitter splitter(filePath, number);
splitter.split();
}
};
上述代码存在的问题:
- 比如说需求变化,用户希望加一个进度条,来进行进度展示
修改后的代码:
FileSplitter.cpp
class FileSplitter
{
string m_filePath;
int m_fileNumber;
ProgessBar* m_progessBar;
public:
FileSplitter(const string& filePath, int fileNumber,
ProgessBar* progessBar) :
m_filePath(filePath),
m_fileNumber(fileNumber),
m_progessBar(progessBar)
{
//...
}
void split()
{
//1.读取大文件
//2.分批次向小文件中写入
for (int i = 0; i < m_fileNumber; i++)
{
//..
if (m_progessBar != nullptr)
{
m_progessBar->setValue((i + 1) / m_fileNumber);//更新进度条
}
}
}
};
mainForm.cpp
class MainForm :public Form
{
TextBox* txtFilePath;
TexBox* texFileNumber;
ProgessBar* progessBar;
public:
void Button1_Click() {
string txtPath = txtFilePath->getText();
int number = atol(texFileNumber->getText().c_str());
FileSplitter splitter(filePath, number, progessBar);
splitter.split();
}
};
存在的问题点:
违背的依赖倒置的原则,依赖具体实现细节。
