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

前端之家收集整理的这篇文章主要介绍了设计模式之禅-单一职责原则前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

2.用户行为类

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

3.形成统一的用户接口

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

};

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

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

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

    }

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

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

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

};

5.main测试

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

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

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

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

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

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

测试结果

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

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

2.电话数据接口

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

3.电话的总接口

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

};

4.电话接口的实现类

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

};

5.main测试

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

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

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

    system("pause"@H_301_20@);
    return@H_301_20@ 0@H_301_20@;
}

测试结果

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

猜你在找的设计模式相关文章