作者:楼兰祈珞 | 来源:互联网 | 2023-06-22 15:03
设计模式_03六大设计原则设计模式_03六大设计原则开闭原则里氏代换原则依赖倒转原则接口隔离原则迪米特法则合成复用原则设计模式_03六大设计原则开闭原则对扩展开放,
设计模式_03 六大设计原则
- 设计模式_03 六大设计原则
- 开闭原则
- 里氏代换原则
- 依赖倒转原则
- 接口隔离原则
- 迪米特法则
- 合成复用原则
设计模式_03 六大设计原则
开闭原则
对扩展开放,对修改关闭。
通过接口和抽象类来实现。
代码实现:
class Abstract_father {
public:virtual void func() = 0;
};class son1 : Abstract_father {
public:void func() {cout << "son1" << endl;}
};
里氏代换原则
任何基类可以出现的地方,子类一定可以出现。
子类可以扩展父类的功能,但不能改变父类原有的功能(尽量不要重写父类的方法)。运用多态非常频繁时,程序出错的概率很大。
依赖倒转原则
高层模块不应该依赖于低层类。
两者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象。对抽象进行编程。
接口隔离原则
客户端不应该被迫依赖于它不使用 的方法。
一个类对另一个类的依赖应该建立在最小的接口上。
原始案例:
class Abstract_father {
public:virtual void func1() = 0;virtual void func2() = 0;
};class son1 : Abstract_father {
public:void func1() {cout << "son1" << endl;}void func2() {}
};
改进案例:
class Abstract_father {
public:virtual void func1() = 0;
};class Abstract_Mother {
public:virtual void func2() = 0;
};class son1 : Abstract_father {
public:void func1() {cout << "son1" << endl;}
};
迪米特法则
如果两个软件实体无需直接通信,那么就不应该发生直接的相互调用,可以通过第三方(中介)转发该调用。
class house_searcher {
public:string searcherName() {string name = "searcher";return name;}
};class house_host {
public:string hostName() {string name = "host";return name;}
};
class agent {
private:house_searcher searcher;house_host host;
public:void getName() {cout << searcher.searcherName() << &#39; &#39; << host.hostName() << endl;}
};
合成复用原则
尽量先使用组合或者聚合等关系来实现,齐次再考虑继承关系。
类的复用分为继承复用和合成复用。
继承复用缺点:
1.继承关系破坏了父类的封装特性。子类可以对父类方法进行重写。
2.子类和父类耦合度高。父类进行修改,子类需要相应进行修改。
3.限制了复用的灵活性。在运行时继承关系不可被修改。
合成复用的优点:
1.维持了类的封装性。
2.对象间的耦合度低。
3.复用的灵活性高。新对象可以动态引用与成员对象类型相同的对象。
继承复用代码:
class Car {
public:virtual void show() {cout << "car" << endl;}
};class electricCar : Car {
public:virtual void show() {cout << "electriCar" << endl;}
};class whiteElectricCar : electricCar {
public:virtual void show() {cout << "whiteElectricCar" << endl;}
};class redElectricCar : electricCar {
public:virtual void show() {cout << "redElectricCar" << endl;}
};
合成复用代码:
class Color {
public:void show() {cout << "red ";}
};class Car {
protected:Color color;
public:virtual void show() {Car::color.show();cout << "Car" << endl;}
};class electricCar : Car {
public:virtual void show() {Car::color.show();cout << "electriCar" << endl;}
};