依赖倒转原则

传统过程式设计 传统的过程式设计倾向于使高层次的模块依赖于低层次的模块,抽象层依赖于具体实现层 // 底层实现 class BankWorker{ public: void saveService(){ cout << "办理存款业务..." << endl; } void transferService(){ cout << "办理转账业务..." << endl; } void payService(){ cout << "办理支付业务..." << endl; } }; // 中层封装 void doSaveBusiness(BankWorker* worker){ worker->saveService(); } void doTransferBusiness(BankWorker* worker){ worker->transferService(); } void doPayBusiness(BankWorker* worker){ worker->payService(); } // 高层调用 void test1(){ BankWorker* bw = new BankWorker; doSaveBusiness(bw); doPayBusiness(bw); doTransferBusiness(bw); delete bw; } 依赖倒转 // 抽象层 class AbstractWorker{ public: virtual void doBusiness() = 0; }; // 实现层 class SaveBankWorker:public AbstractWorker{ public: void doBusiness()override{ cout << "办理存款业务....

January 31, 2022 · 1 min · Rick Cui

合成复用原则

优先使用组合的方式,而不是继承 class AbstractCar{ public: virtual void run() = 0; }; class BMW:public AbstractCar{ public: void run()override{ cout << "BMW run" << endl; } }; class DaZhong:public AbstractCar{ public: void run()override{ cout << "DaZhong run" << endl; } }; #if 0// 错误的做法 class Person : public BMW{ public: void drive(){ run(); } }; void test1(){ Person p; p.drive(); } #endif // 正确做法 class Person{ public: Person(){ car = nullptr; } Person(AbstractCar* c){ car = c; } void drive(){ car->run(); delete car; } void drive(AbstractCar* car){ car->run(); delete car; } private: AbstractCar* car; }; void test2(){ // 方式一: Person* p = new Person(new BMW); p->drive(); delete p; p = new Person(new DaZhong); p->drive(); delete p; // 方式二: Person pp; pp....

January 30, 2022 · 1 min · Rick Cui

迪米特法则

又叫最少知识原则 封装一个中间层进行隔离 class AbstractBuilding{ public: virtual string getQuality()const = 0; virtual void sale() = 0; }; class BuildingA:public AbstractBuilding{ public: BuildingA(){ m_quality = "高品质"; } string getQuality()const override{ return m_quality; } void sale()override{ cout << "楼盘A:" << m_quality << endl; } private: string m_quality; }; class BuildingB:public AbstractBuilding{ public: BuildingB(){ m_quality = "低品质"; } string getQuality()const override{ return m_quality; } void sale()override{ cout << "楼盘B:" << m_quality << endl; } private: string m_quality; }; // 错误的做法 // 客户端 void test1(){ string myRequest = "低品质"; BuildingA* bA = new BuildingA; if(bA->getQuality() == myRequest){ bA->sale(); delete bA; } BuildingB* bB = new BuildingB; if(bB->getQuality() == myRequest){ bB->sale(); delete bB; } } // 正确做法 // 封装一个中间类 class Mediator{ public: Mediator(){ AbstractBuilding* b = new BuildingA; vb....

January 30, 2022 · 1 min · Rick Cui

开闭原则

对扩展开放,对修改关闭,类的改动是通过增加代码进行的,而不是修改源代码 如下所示,如果想要扩展乘法、除法、取模等算法,就不用修改原码,只需增加新类 class AbstractCalculator{ public: virtual void setOperatorNum(int a, int b) = 0; virtual int getResult() = 0; }; class PlusCalculator:public AbstractCalculator{ public: void setOperatorNum(int a, int b)override{ m_a = a; m_b = b; } int getResult()override{ return m_a + m_b; } private: int m_a{0}; int m_b{0}; }; class MinusCalculator:public AbstractCalculator{ public: void setOperatorNum(int a, int b)override{ m_a = a; m_b = b; } int getResult()override{ return m_a - m_b; } private: int m_a{0}; int m_b{0}; }; int main() { AbstractCalculator* calculator = new PlusCalculator; calculator->setOperatorNum(10, 20); cout << calculator->getResult() << endl; delete calculator; calculator = nullptr; calculator = new MinusCalculator; calculator->setOperatorNum(10, 20); cout << calculator->getResult() << endl; delete calculator; calculator = nullptr; return 0; }

January 30, 2022 · 1 min · Rick Cui

面向对象设计原则

原则目的:高内聚,低耦合 单一职责原则 Single Responsibility Principal(SRP):类的职责单一,对外只提供一种功能 开闭原则 Open-Closed Principal(OCP):对扩展开放,对修改关闭,类的改动是通过增加代码进行的,而不是修改源代码 里氏代换原则 Liskov Substitution Principal(LSP):任何抽象类出现的地方都可以用他的实现类进行替换(多态) 依赖倒转原则 Dependence Inversion Principal(DIP):依赖于抽象(接口),不要依赖具体的实现(类),针对接口编程 接口隔离原则 Interface Segregation Principal(ISP):一个接口应该只提供一种对外功能,不应该把所有操作都封装到一个接口中去 合成复用原则 Composite Reuse Principal(CRP):对于继承和组合,优先使用组合 迪米特法则 Law of Demeter(LoD):一个对象应当对其他对象尽可能少的了解,从而降低各个对象之间的耦合。例如在一个程序中,各个模块之间相互调用时,通常会提供一个统一的接口来实现。这样其他模块不需要了解另外一个模块的内部实现细节(黑盒原理)

January 30, 2022 · 1 min · Rick Cui