夜深人静,秋高气爽,正值学习好时候,上周阅读设计模式的六个原则,包括单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则。
单一职责原则(SRP:single responsibility principle):不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
我们写一个最简单的加法类,如下:
#pragma once
#include <iostream>
using namespace std;
class CAdd
{
public:
CAdd(int a, int b);
~CAdd();
public:
int Cal();
void Display();
private:
int m_iNum1;
int m_iNum2;
int m_iResult;
};
#include "add.h"
CAdd::CAdd(int a, int b)
{
m_iNum1 = a;
m_iNum2 = b;
}
CAdd::~CAdd()
{
}
int CAdd::Cal()
{
m_iResult = m_iNum1 + m_iNum2;
return m_iResult;
}
void CAdd::Display()
{
cout << "Cal Result is " << m_iResult << endl;
}
对于一个加法职责只需完成其加法运算即可,对于业务逻辑之外的显示功能应该分离出来,交给页面类来处理,修改后如下:
#pragma once
class CAdd
{
public:
CAdd();
~CAdd();
public:
int Cal(int a, int b);
};
#include "Cal.h"
CAdd::CAdd()
{
}
CAdd::~CAdd()
{
}
int CAdd::Cal(int a, int b)
{
return a + b;
}
#pragma once
#include "Cal.h"
class CCalUI
{
public:
CCalUI();
~CCalUI();
public:
void Display();
};
#include "CalUI.h"
#include <iostream>
using namespace std;
CCalUI::CCalUI()
{
}
CCalUI::~CCalUI()
{
}
void CCalUI::Display()
{
CAdd add;
int iResult = add.Cal(1, 2);
cout << "Display1:" << iResult<< endl;
cout << "----Display2----" << iResult << endl;
}
这样对于加法算法不过遇到什么样UI均可以移植。
对于单一职责原则来说,项目的需求不同,职责的粒度划分也往往有差别;粒度划分多细,需要根据项目的具体情况分析。