class 类练习4 简单交互 / 复杂交互 / list / list的遍历

// 本函数功能需要在-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.拥有授权人士的名单,而且也可以往名单里添加内容 = 服务器可以可以给不计数个人授权



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值