C++设计模式-6原则(合)

本文介绍了面向对象设计中的五个基本原则:单一职责原则强调类的职责单一;里氏替换原则确保子类不会破坏父类意图;依赖倒置原则提倡高层依赖抽象;接口隔离原则避免无谓接口;迪米特法则提倡最小知识交流。同时提及了开闭原则,即系统应易于扩展而不影响已有代码。
摘要由CSDN通过智能技术生成

目录

单一职责

里氏替换

依赖倒置

接口隔离

迪米特法则

开闭原则


单一职责

 单一职责原则定义了类的封装规范。(封装、继承、多态)

定义:有且仅有一个引起类变化的原因。

e.g.1.一个需要重新封装的类

class A {
public:
	void funName() {}
	void funSex() {}
	void funAge() {}
	void funCourse() {}//要重新封装到其他类
	void funTeacher() {}//要重新封装到其他类
	void funProject() {}//要重新封装到其他类
private:
	std::string m_strName, m_strSex;
	int m_nAge;
	std::string m_Course1, m_TeacherName,m_ProjectName;//要重新封装到其他类
};

e.g.2不可散乱为全局变量

std::string g_strName, g_strSex;
int g_nAge;
std::string g_Course1, g_TeacherName, g_ProjectName;
void funName() {}
void funSex() {}
void funAge() {}
void funCourse() {}
void funTeacher() {}
void funProject() {}

里氏替换

 里氏替换原则定义了继承规范。(封装、继承、多态)

定义1:类型S对象o1,类型T对象o2,o1换成o2时程序意图不变,那么S是T的子类。

定义2:使用子类不破坏父类的意图。

注意:如果子类不能完成父类意图,则不使用继承,采用依赖、聚合、组合等。

e.g.1 不符合里氏替换原则

#include <iostream>
using namespace std;
class Map {
};
class HashMap :public Map {
};
class Father {
public:
	virtual void DoSth(HashMap& map) {
		cout << "father dosth" << endl;
    }
};
class Sun :public Father {
public:
    void DoSth(Map& map) {//加override:error C3668: “Sun::DoSth”: 包含重写说明符“override”的方法没有重写任何基类方法
        cout << "sun dosth" << endl;
    }
};
int main(){
    Father* f = new Father;
    HashMap* map = new HashMap;
    f->DoSth(*map);//father dosth
    //根据里氏替换原则
    Sun* s = new Sun;
    s->DoSth(*map);//sun dosth//这时子类没有重写父类函数,歪曲了父类的意图
    //里氏替换原则,所有引用基类的地方必须能透明的使用其子类对象。
    //说明:要想子类替换父类,则子类的函数必须扩大于父类参数。
}

e.g.2不符合里氏替换原则

#include <iostream>
using namespace std;
class Map {
};
class HashMap :public Map {
};
class Father {
public:
	virtual void DoSth(Map& map) {
		cout << "father dosth" << endl;
	}
};
class Sun :public Father {
public:
	void DoSth(HashMap& map) {//加override:error C3668: “Sun::DoSth”: 包含重写说明符“override”的方法没有重写任何基类方法
		cout << "sun dosth" << endl;
	}
};
int main() {
	Father* f = new Father;
	HashMap* map = new HashMap;
	f->DoSth(*map);//father dosth
	//根据里氏替换原则
	Sun* s = new Sun;
	s->DoSth(*map);//sun dosth//这时子类没有重写父类函数,歪曲了父类的意图
	//里氏替换原则,所有引用基类的地方必须能透明的使用其子类对象。
	//说明:这里子类对父类的参数进行收窄。
}

依赖倒置

依赖倒置原则定义了类的封装规范。(封装、继承、多态)

定义:高层不依赖底层,两者依赖抽象;抽象不依赖细节;细节依赖抽象。

精简定义:面向接口编程

依赖传递方法:1.构造函数2.set函数3.直接调用法。

接口隔离

 接口隔离原则定义了类的接口封装规范。(封装、继承、多态)

定义:不依赖不需要的接口。

e.g.1一个不符合接口隔离原则的例子

//普通搜索接口类
class IBookSearcher
{
public:
	virtual void SearchByName() = 0;//根据名称搜索
	virtual void SearchByAuthor() = 0;//根据作者搜索
	virtual void SearchByPublisher() = 0;//根据出报社搜索
	virtual void ComplaxSearch() = 0;//综合搜索仅对admin使用//应该把这种搜索方法独立封装成一个接口类
};

迪米特法则

定义:最小知识原则。1.不需要引入无关类。2.不需要开放详细接口。

开闭原则

定义:对扩展开放对修改关闭。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值