// 本函数功能需要在-std=c++11的情况下实现
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;
class User;
class Authorisation; // 超前使用说明
----------
class Workstation {
private:
string hostname;
list<Authorisation *> authorisations; //list的相关定义简单介绍请看转载的那一篇
// 在最后面描述了为什么要将[ 授权行为 ]单独成立一个类 - 因为受到影响的对象很多
// 这里是一个list,一个可以凭空在后面增加数据的数组
list内记录了所有的授权行为
----------
public:
Workstation(string h) : hostname(h) {
}
void add_authorisation(Authorisation *auth) {
authorisations.push_back(auth);
}
----------
Authorisation *get_authorisation(User *target);
string get_hostname() const { return hostname; }
};
//类外定义
Authorisation *Workstation::get_authorisation(User *target) {
// go through list looking for target user
// note lazy use of auto to get type for iterator
for (auto iterator = authorisations.begin(); iterator != authorisations.end(); iterator++) {
if ((*iterator)->matches_user(target))
return *iterator;
}
return NULL;
}
// 简单交互实例: 因为本次只是为了查询用户是否具有授权资格,因此不涉及多方操作,就可以当作一次简单交互
// 同时这里使用了一个auto例子作为list头指针的演示,list头指针不是常规的方法表示出的指针,但是auto可以代替
// 遍历list的方法
此外一个authorisation对象包含了除了授权人姓名,还包括了其他信息,因此我们用指针->的功能
----------
class User {
private:
string name;
public:
User(string n) : name(n) {
}
bool login(Workstation &w) {
Authorisation *auth = w.get_authorisation(this);
cout << "login of user '" << name << "' into " << w.get_hostname() << " ";
if (auth == NULL) {
cout << "failed due to lack of authorisation." << endl;
return false;
}
cout << "succeeded!"<< endl;
return true;
}
};
//简单交互:每个用户拥有自己的姓名,用户可以在检查确认拥有授权以后执行登录操作
// 1.姓名当然属于数据层
2. 检查需要与服务器之间产生交互,***仅仅只涉及到两个对象的简单交互模式***
// 3. 简单交互:只涉及到两个对象的简单交互模式,这个时候只要动作发起者的函数里引用另一个对象就可以
4. 本例中不仅是两个类的操作,而且第二个类还没有产生任何影响,
// 5. 更多:简单交互的被执行类也可以调用操作,修改因本次交互受到影响的参数
----------
class StartSession {
private:
string root;
public:
StartSession(string r) : root(r) {
}
StartSession(const StartSession &other) : root(other.root) {
}
};
// 这里正是拷贝行为,由于没有使用引用的方式,因此实参到形参的过程调用了拷贝参数
----------
class Directory {
private:
string name;
Directory *parent;
public:
Directory(string _name, Directory *p) : name(_name), parent(p) {
}
};
//如何表达自己的参数里面包含了自己?
// 题目里会这样描述: 一个X可能还包含了另一个X
----------
class Authorisation {
private:
int priority;
User *user;
Workstation *workstation;
StartSession start;
Directory *default_directory;
public:
Authorisation(User *u, Workstation *w, int p, const StartSession &s, Directory *def) : priority(p), user(u), workstation(w), start(s), default_directory(def) {
w->add_authorisation(this);
}
bool matches_user(User *target) {
return user == target;
}
};
// 授权行为被单独拎出来成为一个类,为什么要单独拎出来成为一类?请看数据层的内容
// 1.执行动作发起的一方
// 2.其他与本次执行动作相关的参数信息
----------
所以为什么要单独将授权行为单独拎出来成为一个类?
因为这是一次 ***复杂交互行为***
// 1.简单交互行为中,所有在一起受到影响的类只有动作发起方 与 被执行方两个类
// 由执行方发起动作,被执行方接受动作,修改双方参数告终
2.但是本次交互行为中,除了用户一方,还有所有详细参数信息都需要记录在案,统称为一次授权行为
// 3.因此,本次交互很多类都会受到影响,至少这些类的对象的一些数据需要记录,由于多方受到影响,因此单独
// 成为一个类,将受到影响的类全都纳作待用的数据
复杂交互
//可以解决多方操作的问题,不仅仅是将多方数据记录下来,更可以调用操作,让多方对象中,受到影响的参数执行修改
----------
int main() {
User will("will");
Workstation beast("beast");
Workstation mi5("topsecret");
StartSession sess("/bin/sh");
Directory root("/", NULL);
Directory homes("/homes",&root);
Directory def("/homes/wjk",&homes);
Authorisation auth(&will, &beast, 10, sess, &def);
will.login(mi5);
will.login(beast);
return 0;
}
//交互思想: 1.服务器拥有域名,可以获取到域名, = 每个服务器都有自己的域名
// 2.拥有授权人士的名单,而且也可以往名单里添加内容 = 服务器可以可以给不计数个人授权
class 类练习4 简单交互 / 复杂交互 / list / list的遍历
最新推荐文章于 2020-02-28 14:24:24 发布