设计模式六大原则:开闭原则-带你走进梦幻西游(三)

时间:2021-05-26 17:24:38

转载请表明:http://blog.csdn.net/liulongling/article/details/51317701

单一职责原则-带你走梦幻西游(一)
依赖倒置原则(二)
迪米特原则-带你走进梦幻西游(四)
里氏替换原则(五)
接口隔离原则(六)
定义
开闭原则是类 函数 模块对外扩展开放,对修改代码关闭,让程序更稳定灵活。

为什么用开闭原则?
在开发过程中,直接修改旧代码,可能会引入新的错误,并且修改完之后要重新对旧代码的测试。这样既降低了开发效率又容易出现BUG。

先看看非开闭原则的代码

//
// 非开闭原则.cpp
// c++
//
// Created by 刘龙玲 on 16/5/4.
// Copyright © 2016年 liulongling. All rights reserved.
//

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>

using namespace std;

int getStoneAbsorbPro(string name,int level)
{
if(name == "红宝石"){
return (0.1*level)*100;
}else if(name == "绿宝石"){
return (0.2*level)*100;
}else{
return 0;
}
}



int main()
{
int a =getStoneAbsorbPro("红宝石",1);
int b =getStoneAbsorbPro("绿宝石",2);
int c =getStoneAbsorbPro("蓝宝石",3);
//非开闭原则就是如果再新增一个黄宝石 你需要在getStoneAbsorbPro方法里修改代码
return 1;
}

开闭原则代码

//
// 开闭原则.cpp
// c++
//
// Created by 刘龙玲 on 16/5/4.
// Copyright © 2016年 liulongling. All rights reserved.
//

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>

using namespace std;

class Stone
{
public:
Stone(int level):level(level){}
virtual int getStoneAbsorbPro() = 0;
public:
int level;
string name;
};

//红宝石
class RedStone:public Stone
{
public:
RedStone(int level):Stone(level)
{
this->name = "红宝石";
}

virtual int getStoneAbsorbPro()
{
return (this->level*fire_xs)*100;
}
public:
float fire_xs = 0.2;
};

//绿宝石
class GreenStone :public Stone
{
public:
GreenStone(int level) :Stone(level)
{
this->name = "绿宝石";
}

virtual int getStoneAbsorbPro()
{
return (this->level*thunder_xs)*100;
}
public:
float thunder_xs = 0.1; //雷属性吸收
};

//蓝宝石
class BlueStone :public Stone
{
public:
BlueStone(int level) :Stone(level)
{
this->name = "蓝宝石";
}

virtual int getStoneAbsorbPro()
{
return 0;
}
};



//开闭原则是如类 函数对外扩展开放 对修改关闭
//我觉得开闭原则就是用抽象构建框架,用实现扩展细节
int main()
{
Stone* stone1 = new RedStone(1);

cout<<"石头:"<<stone1->name<<" 吸收概率:"<<stone1->getStoneAbsorbPro()<<endl;

Stone* stone2 = new BlueStone(2);
cout<<"石头:"<<stone2->name<<" 吸收概率:"<<stone2->getStoneAbsorbPro()<<endl;

Stone* stone3 = new GreenStone(3);
cout<<"石头:"<<stone3->name<<" 吸收概率:"<<stone3->getStoneAbsorbPro()<<endl;
return 1;
}