加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

设计模式之禅-单一职责原则

发布时间:2020-12-14 02:13:35 所属栏目:百科 来源:网络整理
导读:设计模式之禅-单一职责原则 一 简介 在类的设计中,为了使得类的设计具有更好的可读性,可维护性,通常将这个类设计为只完成唯一的任务(职责),但是这通常是很难实现的,因为有实际的外界因素影响。 二 实例分析 实例1 :将一个用户的属性和行为在不同的类中

设计模式之禅-单一职责原则
一 简介
在类的设计中,为了使得类的设计具有更好的可读性,可维护性,通常将这个类设计为只完成唯一的任务(职责),但是这通常是很难实现的,因为有实际的外界因素影响。
二 实例分析
实例1:将一个用户的属性和行为在不同的类中设计。
1.用户属性类

/*用户信息的属性--只负责用户的属性*/
class IUserBO
{
public:
    virtual void setUserID(string userID) = 0;
    virtual string getUerID() = 0;

    virtual void setPassword(string password) = 0;
    virtual string getUserPassword() = 0;

    virtual void setUserName(string userName) = 0;
    virtual string getUserName() = 0;
};

2.用户行为类

/*用户信息的业务操作--只负责用户的行为*/
class IUserBiz
{
public:
    virtual bool changePassword(string password) = 0;
    virtual bool deleteUser() = 0;
};

3.形成统一的用户接口

/*实际的用户信息接口-继承了用户属性和行为的的接口*/
class IUserInfo : public IUserBO,public IUserBiz
{
public:

};

4.实现了用户接口的用户类

/*实际的用户信息类*/
class UserInfo : public IUserInfo
{
public:
    //属性
    void setUserID(string userID) override
    {
        cout << "setUserID" << endl;
    }
    string getUerID() override
    { 
        return "getUerID";
    }

    void setPassword(string password) override
    {
        cout << "serPassword" << endl;
    }
    string getUserPassword() override
    { 
        return "getUserPassword";

    }

    void setUserName(string userName) override
    {
        cout << "setUserName" << endl;
    }
    string getUserName() override
    { 
        return "getUserName";
    }

    //行为
    bool changePassword(string password) override
    {
        cout << "changePassword" << endl;
        return true;
    }

    bool deleteUser() override
    {
        cout << "deleteUser" << endl;
        return true;
    }

};

5.main测试

int main()
{
    //用户信息(属性和行为)对象
    IUserInfo* userInfo = new UserInfo; 

    cout << "设置用户属性信息" << endl;

    //转换成用户属性对象
    IUserBO* userBO = static_cast<IUserBO*>(userInfo);
    cout << userBO->getUserPassword() << endl;
    cout << userBO->getUerID() << endl;
    cout << userBO->getUserName() << endl;

    userBO->setPassword("123456");
    userBO->setUserID("1");
    userBO->setUserName("Tom");

    cout << "设置用户行为" << endl;

    //转换成用户行为对象
    IUserBiz* userBiz = static_cast<IUserBiz*>(userInfo);
    userBiz->changePassword("123789");
    userBiz->deleteUser(); 
    system("pause");
    return 0;
}

测试结果

实例2:将电话的协议和数据传输封装在不同的接口中
1.电话协议接口

/*电话协议接口*/
class IConnectionManager
{
public:
    virtual void dial(string phoneNumber) = 0;
    virtual void hangup() = 0;
};

2.电话数据接口

/*电话数据接口*/
class IDataTransfer
{
public:
    virtual void DataTransfer(IConnectionManager* com) = 0; 
};

3.电话的总接口

/*电话接口*/
class IPhone : public IConnectionManager,public IDataTransfer
{
public:

};

4.电话接口的实现类

/*具体的电话类*/
class Phone :public IPhone
{
public:
    void dial(string phoneNumber) override
    {
        cout << "dial" << endl;
    }
    void hangup() override
    {
        cout << "hangup" << endl;
    }
    void DataTransfer(IConnectionManager* com) override
    {
        cout << "DataTransfer" << endl;
    }

};

5.main测试

int main()
{
    //电话类
    IPhone* iphone = new Phone;

    //电话协议接口
    IConnectionManager* com = static_cast<IConnectionManager*>(iphone);
    com->dial("213");
    com->hangup(); 

    //电话数据传输接口
    IDataTransfer* transfer = static_cast<IDataTransfer*>(iphone);
    transfer->DataTransfer(com);

    system("pause");
    return 0;
}

测试结果

三 总结
单一职责原则简称SRP原则,在实际工作中,可能不会经常用到,但是我们必须知道这个原则,建议大家看看设计模式之禅这本书。
下面是这次的云盘资料:https://yunpan.cn/cSSeVREPqE69R 访问密码 5051

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读