动机(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(); } };
存在的问题点:
违背的依赖倒置的原则,依赖具体实现细节。