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

转载请表明: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值