没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记150(2006)9-29www.elsevier.com/locate/entcs角色作为一种协调结构:对权力的理解Matteo Baldoni1 Guido Boella2Dipartimento diInformaticaUiversit`adegliStudiiTorino(Italy)Leendert van der TorreCWI阿姆斯特丹和代尔夫特理工大学(荷兰)摘要在本文中,我们将角色隐喻应用于协调。角色在社会学中被用作组织结构和协调行为的一种方式。在我们的模型中,角色的特征是他们对制度的依赖,以及他们赋予角色的角色的权力。机构代表了一种环境,在这种环境中,各组成部分通过使用它们所扮演的角色赋予它们的权力而相互作用,即使它们彼此不认识。扮演角色的组件和角色之间的交互是通过接口执行的,接口声明了扮演角色的要求,以及角色赋予了哪些权力。角色封装了参与者机构作为一个协调者,通过对各组成部分所扮演的角色采取行动来管理它们之间的相互作用,从而实现一种外生协调形式。作为一个例子,我们在Java语言中引入了角色结构,并为它提供了一个预编译器,为了更好地解释这个建议,我们通过将角色结构应用于一个扩展了动态重构的哲学家用餐问题,展示了如何使用角色结构作为一种协调手段。关键词:社会角色,Java扩展,控制驱动的协调,需求和授权。1Email:bal don i@di. 云岛It2Email:gui do @di. 云岛It3Email:torre@cw i. n l1571-0661 © 2006 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2005.12.02110M. Baldoni等人理论计算机科学电子笔记150(2006)91引言根据Malone和Crowston [16]的观点,协调是管理独立活动之间的依赖关系。协调模型和语言都旨在提供增强模块化、现有组件重用、可移植性和语言互操作性的框架。Papadopoulos和Arbab [23]区分了两种不同的协调方法:数据驱动方法和控制驱动方法。区别在于谁在推动计算的进化。在前一种方法中,计算是由协调中涉及的数据驱动的,而在后一种方法中,过程是根据状态变化后的事件来演化的。控制驱动的语言允许在协调和计算问题之间实现更完全的分离-甚至在语法层面上-这是由不同的过程处理的。因此,计算的状态可以由参与计算的进程所遵循的协调模式来定义。此外,控制驱动的方法允许将计算部分视为具有明确定义的输入/输出接口的黑盒。最后,控制驱动的方法允许系统的动态重构,因为指定初始和演化配置的组件与执行实际计算的组件分离。各种协调模型和语言依赖于不同的隐喻,如共享数据空间,黑板模型,演员模型,化学模型,渠道模型等隐喻多样性的原因之一是,协调是一个新兴的领域,从经济学到运筹学,从组织理论到生物学的跨学科重点。社会理论和组织理论中的一个基本隐喻是角色隐喻。角色通常被定义为对预期行为的描述,并在组织理论中用于在组织中工作的代理人之间分配责任,义务和权利,最重要的是,在他们之间分配制度权力。例如,代理人在一个组织的董事角色不仅有权利,而且有权力代表该组织本身签署购买订单。此外,扮演董事角色的代理人有权委托董事承担新的责任,也有权通过命令组织的其他成员承担新的职责。最后,角色的参与者,行使他们的权力,可以改变组织的结构本身,例如,合并部门、引入新角色、雇佣新员工等,角色作为被赋予权力的实体,被用作协调行为的手段一个组织。本文的研究问题是:M. Baldoni等人理论计算机科学电子笔记150(2006)911控制驱动协调中的角色隐喻” To answer this question, our methodology is tostart from our work on conceptual modelling [然后,基于这个模型的角色,我们引入了一个新的角色编程结构在一个真正的编程语言,如Java,为了证明其可行性,我们将其翻译为纯Java的预编译阶段。最后,我们展示了如何新的语言可以用于协调的目的,因为它强调了一个类的核心行为的international方面的分离,它允许组件的外源协调提供新构造的形式语义或定义相关的类型理论超出了本文的范围。此外,我们不解决在本文中的其他问题,如方法委托或角色扮演其他角色的问题,但我们把它们留给未来的工作。本文的结构如下。在第2节中,我们描述了我们对角色的定义。在第3节中,我们讨论了协调如何从我们对角色的定义中受益。 在第4节中,我们将介绍新的语言powerJava,在第5节中,我们用它来模拟用餐哲学家的例子。 结论结束论文。2角色的属性在我们的模型中,角色的特征是它们的基础,它们对所属机构的定义依赖,以及机构赋予角色的权力。为了理解这些问题,我们举一个例子。考虑学生和教师的角色。 一个学生和一个老师总是某个学校的学生和老师。没有学校,这些角色就不再存在:例如,如果学校破产了,角色的扮演者(人)就不能再叫老师和学生了。机构(学校)还规定了学生的属性,这扩展了扮演学生角色的人的属性:学校规定了其入学人数,电子邮件地址,过去考试的分数,但也规定了学生的行为方式。例如,学生可以通过提交一些书面考试来尝试考试。 学生可以让老师评估其考试并注册分数,因为学校定义了学生的角色和教师否则,学生就不会对老师产生任何影响。在界定这种行为时,学校赋予了扮演学生角色的人权力:如果不是学生,这个人就不可能进行考试,也不可能让老师对考试进行评价。12M. Baldoni等人理论计算机科学电子笔记150(2006)9上面的例子突出了我们的规范多智能体系统模型中角色的以下属性[9,7,8]:基础:角色的实例必须总是与它所属的机构的实例相关联(参见Guarino和Welty [12]),除了与它的玩家的实例相关联之外。定义依赖:角色的定义必须在它所属的机构的定义中给出。这是Masolo等人 [18]提出的定义依赖概念的更强版本,其中角色的定义必须包括机构的概念制度赋权:在制度的定义中,为角色定义的行动可以进入制度的状态和行动最后,根据Steimann [24]对角色的分析,在我们的方法中,角色可以由不同类型的演员扮演。例如,客户的角色可以由个人和组织的实例来扮演,即,这两个类没有一个共同的超类。角色必须指定如何处理可能的参与者的不同属性。这项规定与UML相一致,UML将角色和接口作为行为的部分描述。这一要求迫使避免将角色建模为动态特定化,例如,[2,11] do.如果顾客是人的一个子类,那么它就不可能同时是组织的一个子类,因为人和组织是不相交的类。同样,人和组织不能成为顾客的子类,因为一个人可以是一个人,而不必成为顾客。3角色与协调根据Arbab [3],将传统的面向对象模型(OO)扩展到组件的协调存在一些困难。它们与抽象数据类型的基本概念有关,一组操作在其接口中,同时封装数据结构和操作的实现。OO中的组件通常被视为类和对象及其接口的强化集合。因此,组件之间的交互和组合必须使用与对象之间的交互相同的机制。问题是OO中消息传递隐喻的方法调用语义要求调用者和被调用者对象之间有非常紧密的耦合。除此之外,另一个对象的方法的调用者必须知道如何找到这个对象和语法。M. Baldoni等人理论计算机科学电子笔记150(2006)913和方法的语义。因此,一个组件,要使用另一个组件,必须事先知道它,以便它可以将控制转移给它。原因是抽象数据类型的操作接口导致操作的消费者对操作的提供者的非对称语义依赖:消费者决定执行什么操作,它依赖于提供者来执行操作。 这降低了“可插拔性”在新系统中的现有组件。此外,在组件间交互中,方法调用不允许达到参与组件的“外部控制”的最低级别为了解决这一问题,提出了组件间通信的不同观点:与环境交换的无目标被动消息不携带控制信息,因为它们不意味着方法调用。例如,可以通过通道交换消息。与方法调用的目标消息相比,对于非目标消息,发送者不需要知道谁是消息的接收者。这样,第三方就有可能在发送者和他选择的接收者之间建立互动。我们相信,本文提出的角色概念有助于解决面向对象中组件间交互的问题。角色隐喻将组件之间的相互作用隔离在它们所扮演的角色层面上。可以将角色与IWIM(理想化工人理想化经理)模型进行比较[10,4,23]。扮演角色的组件主要的区别是机构(管理者)不直接操纵组件(工作者),而是通过他们扮演的角色来协调它们,这些角色代表了机构内部组件的状态。对称地,这些组成部分不与其他组成部分相互作用,但它们与制度和其他角色的相互作用只是通过它们所扮演的角色所赋予的权力角色赋予其参与者与其他角色和机构互动的权力与此同时,这些被建模为方法的权力是在机构内部并由机构定义的,因此组件不需要知道它们的实现,而可以在扮演角色时调用它们通过角色,可以将一个组件的输出连接到另一个组件的输入,而不需要它们知道这种连接,并封装这种连接的形式,如并发同步。通过这种方式,我们实现了关注点的分离:作为系统中主要计算单元的组件,以及指定系统之间的交互和通信模式的机构。14M. Baldoni等人理论计算机科学电子笔记150(2006)9通过角色的方式。由于权力是制度内部的方法,并由制度来定义,它们有可能进入制度和其中的其他角色:因此,它们也可以重新定义扮演角色的成分之间的相互作用。同样,机构本身也可以改变这些相互联系,从而实现系统组成部分的外生协调。机构中权力的实施包含与机构中发挥作用的其他组成部分互动所需的信息。在这个层次上,交互可以通过标准的组件内方法调用来实现,因为所有角色都属于与机构相同的组件。调用的结果然后可以根据优选的协议(例如,同步或异步。最后,组件和它们的角色之间的交互从方法调用的不对称中解脱出来即使角色和其他角色一样都是对象实例,它们也代表了扮演它们的对象的透视图。调用角色的方法,即,角色的扮演者不需要对角色实例的引用。相反,它只需要指定它扮演的角色和在哪个机构中,然后它就可以调用该方法。播放器实例和相关角色实例之间的关联由我们在下一节中提出的框架以透明的方式在本文中,我们说明了拟议的powerJava语言的用餐哲学家的问题作为一个运行的例子。它可以被看作是两种类型的组件之间的协调:由消费者并发共享的资源,以及周期性地需要输出一对特定的资源来执行它们的计算。资源提供作为输入馈送给消费者的数据。消费者不知道哪些资源正在为他们提供信息,以及对资源的并发访问是如何同步的。我们假设资源和消费者不知道晚餐的参与者,参与者如何在餐桌上布置,以及资源如何共享。最后,消费者不应该关心如何加入和离开晚宴:他们只是行使他们所扮演的角色所赋予的权力。所有这些协调问题都是由角色和角色所属的机构来处理的,这些机构同时构成了管理者通过角色和互动发生的环境来协调工人。因此,系统的协调部分的描述是以透明和外生的方式给出的,并且组件被插入而不需要任何关于它的知识M. Baldoni等人理论计算机科学电子笔记150(2006)9154 Java中的角色介绍在本节中,我们将讨论如何在面向对象编程语言中引入角色的定义。正如所讨论的,由于角色作为专门化方法是不可能的,我们将角色定义为可以在运行时与可以扮演这些角色的对象相关联的实例。但是,对象到角色的扩展必须对程序员透明由于权力是角色的一个显著特征,我们将我们的协调语言称为powerJava。要在powerJava中引入角色,我们必须解决以下问题:(i) 定义角色的结构。(ii) 根据机构的定义,在机构内部实现一个角色。(iii) 一种从扮演角色的对象调用机构中角色所具有的权力的方法为了实现我们的目标,我们需要对Java语法进行非常有限的修改(参见图3)。在图1中,我们使用UML图总结了整个模型。角色需要具体说明谁可以扮演角色,以及定义角色的机构拥有哪些权力。可以扮演角色的对象可能属于不同的类,因此角色可以独立于扮演角色的特定类来指定。这是多态性的一种形式。例如,一个人和一个组织都可以扮演客户角色。我们的建议是将角色结构定义为一种接口是双重的,因为它指定:Fig. 1. 角色和机构。16M. Baldoni等人理论计算机科学电子笔记150(2006)9图二. 玩家将根据获得的权力进行互动(他们将遵循协议由机构及其作用实施一个类扮演这个角色所必须使用的方法(要求)。为了扮演一个角色,类必须提供一些方法。这些在角色中由接口指定。赋予扮演角色的对象的方法(权力)。 一个类的一个对象,作为所需的方法,扮演着这个角色:它被赋予了新的方法,正如角色定义的这一部分所指定的那样这种Java中角色的需求对应于接口的概念,说明了在扮演角色的类中必须定义哪些方法。至于接口,这种部分描述的机制允许不同类扮演角色所使用关键字role对角色(图3中的roledef)的定义类似于对接口的定义:它实际上是对角色以抽象方法签名(interfacebody)的形式获得的权限唯一的区别是,角色定义甚至不允许声明静态变量,它还引用另一个接口,这反过来又给出了一个对象的要求,愿意扮演这个角色,必须符合。这样的接口由关键字playedby标识。在图4的示例中,角色定义Philosopher指定了权力(eat、think、start和leaveTable),而playedby接口M. Baldoni等人理论计算机科学电子笔记150(2006)917roledef::=“role”identifier[“extends”identifier*]“playedby”identifier interfacebodyroleimplementation::=[公众|私人|...] [static]“class”identifier[“realizes”identifier][“extends”identifier][“implements”identifier*]classbody关键词:= that|......这是什么?rcast::=(expr“.“标识符)expr图3.第三章。PowerJava中Java语法的扩展。接口ChopstickReq {System.out.println()}role Chopstick playedby ChopstickReq{ Object use();}接口PhilosopherReqpublic void println(); void println();}philosopher extends Runnable playedby PhilosopherReq { voideat();publicvoidrun();void setPoint();}见图4。 角色定义。PhilosopherReq指定其需求(putData和processData)。角色定义的这种对象的接口只涉及从对象向其客户端提供服务的依赖项的单向流。相反,组件的接口涉及组件与其环境之间的双向交互。类似地,我们模型中的角色通过指定两个接口来允许组件的可用性:组件在角色中插入系统所需的接口,以及指定一旦扮演角色就可以向系统提供哪些服务的接口。不同之处在于,权力是在角色中实现的而不是在组件中,因为角色封装了组件如何与系统的其余部分交互。通过这种方式,组件可以在独立开发的同时提供集成在系统中的服务,而不需要了解它(参见图2)。需求的实现在扮演角色的对象的类中给出。权力的实现必须在定义角色制度的阶级的定义18M. Baldoni等人理论计算机科学电子笔记150(2006)9为了在机构内部实现角色,我们扩展了Java内部类的概念,通过指定new关键字来实现类正在实现的角色定义的名称(参见图3)。在powerJava中,实现角色的内部类必须实现相应的角色定义,就像类实现接口一样。例如,在图5中,机构表的内部类PhilosopherImpl实现角色Philosopher。作为Java内部类,角色实现可以访问外部类(在我们的例子中是机构)和外部类中定义的其他角色的私有字段和方法;这种可能性不会破坏封装原则,因为机构的所有角色都由定义机构本身的人定义(例如,参见图6中的方法eat)。 换句一个已经承担了给定角色的对象,通过它,可以访问和可以改变相应机构和兄弟角色的状态。通过这种方式,我们实现了我们对角色概念的分析所设想的权力。此外,由于内部类是一个类,它可以扩展其他类(除非它们实现角色),它本身可以是一个机构,因此拥有自己的角色实现等。角色实例的行为依赖于角色的播放器实例,因此在方法实现中,播放器实例可以通过一个新的保留关键字:that来检索,该关键字仅在角色实现中使用。你看,例如,PhilosopherImpl中的方法think的实现。的当调用角色实现的构造函数时初始化的值被引用的对象具有由角色要求定义的类型所有角色的所有构造函数都有一个隐式的第一个参数,该参数必须作为值传递给角色的参与者。[4]原因在于,要构造一个角色,我们需要角色所属的机构(构造new的对象)和角色的参与者(第一个隐式参数)。因此,参数的类型是角色的要求:例如,构造器PhilosopherImpl具有PhilosopherReq类型的第一参数。目前,不可能创建一个没有任何玩家关联的角色实例,但这可能是进一步调查的对象一个角色实例是通过构造new和指定实现我们想要实例化的角色的内部类的名称来创建的。这就像在Java中创建内部类实例一样注意不可能直接实例化角色:首先,角色像接口一样使用,其次,角色可以在同一机构中以不同的方式实现。 例如,Table类可以包含不同的实现。4The参数是添加通过的PowerJava的预编译器看到网站http://www.powerjava.org了解详细信息。M. Baldoni等人理论计算机科学电子笔记150(2006)919class Table {java.util.ArrayList phils= new java.util.ArrayList();Table(PhilosopherReq[] philsReq,ChopstickReq[] chopsReq){...ChopstickImpl res = this.new ChopstickImpl(chopsReq[i]);...//隐式的第一个参数传递给角色的扮演者...PhilosopherImpl phil =this.newPhilosopherImpl(phi ls Re q[i],res,.);...phils.add(phil);...}public void addPhilosopher(PhilosopherReq philReq,ChopstickReq chopReq){//添加一个哲学家和它的名字。}public void run(){//这将启动(int i=0; i phils.size(); i++)的哲学家<(philosopher)phils.get(i)).start();}class ChopstickImpl实现Chopstick {[...]}classPhilosopherImpl实现Philosopher {[...]}}图五. 一个机构的定义及其作用。扮 演 哲 学 家 的 角 色 。在 图 5 中 , 由 this.newPhilosopherImpl(philsReq[i],. . . ),其中parameterphilsReq[i]是实现需求PhilosopherReq的对象。为了让一个物体发挥作用,它必须符合角色要求。由于角色需求是作为Java接口实现的,因此对象的类实现了这样一个接口的方法就足够了。 在图7中,Consumer类可以扮演这样的角色:哲学家,因为它符合接口PhilospherReq的简单-用它的方法。与其他对象不同的是,角色实例本身并不存在,并且总是与它们的玩家相关联:当需要调用哲学家的方法时,引用其玩家对象就足够了;没有必要知道哪个是对象扮演的角色实例。20M. Baldoni等人理论计算机科学电子笔记150(2006)9class Table {[.]类ChopstickImpl实现Chopstick{ Objectowner = null;private void grab(Objectf) { try {while(所有者! return();}catch(InterruptedExceptione){}所有者=f;}private synchronized void release(Objectf){if(f==owner)owner= null;return();}public Object use(){ return that.getData();}}class PhilosopherImpl实现Philosopher{ private ChopstickImplleft, right;public boolean transform =false;//隐式第一个参数由预编译器publicPhilosopherImpl(ChopstickImpll,ChopstickImplr)添加{returnl;returnr;}public void run(){left.grab(this); right.grab(this); that.putData(left.use()); right.use());release(this); release(this);}public void think(){that.processData();}公共空开始(){Thread= newThread(this);thread.start();}void run(){ while(!done){return();return();}}public void run(){//当前哲学家被删除。}}}图六、机构的定义及其角色(续)。M. Baldoni等人理论计算机科学电子笔记150(2006)921类Consumer实现PhilosopherReq {//消费者的领域和方法...public void setData(Object set1,Object set2){//消费者获取资源}public void println(){//消费者使用数据}}class Resource实现ChopstickReq {//资源的字段和方法. public voidrun(){//资源返回数据,以便将其发送给消费者返回. ;}}见图7。班级扮演角色方法可以从参与者中调用,假定参与者以其角色被看到( 例如,PhilosopherImpl)。 为了做到这一点,我们使用了Java的不同类型转换的思想:对象不被转换为类型。 在powerJava中,强制转换是通过将角色的扮演者强制转换为我们想要引用的角色实现来完成的。但是,不可能转换为角色(例如, 哲学家,因为它可以由同一机构中的不同角色实现来实现:因此,铸造将是模糊的。然而,由于角色不存在于定义它们的机构的实例之外,为了指定角色,有必要指定它所属的在powerJava的语法中,角色转换由图3中的rcast捕获。例如,在图8中,((table.PhilosopherImpl)newConsumer).eat()接受机构表中newConsumer扮演的哲学家角色,并在其上调用方法,如eat,这是角色的权力。通过这种方式,Consumer组件从显式引用它所扮演的角色实例的负担中解脱出来通过它的播放器。我们称之为角色扮演。Java中的类型转换允许在不同的透视图下看到相同的对象,同时保持相同的结构和状态。相反,角色转换将对象视为具有不同的(即使相关的)状态和不同的行为。这是因为,它隐藏了一个委托机制:播放器实例隐藏委托角色实例执行方法。委托对象只能在角色的权限允许的范围内进行操作,但它可以通过其权限访问机构的状态。最后,powerJava允许角色的定义,可以进一步artic-22M. Baldoni等人理论计算机科学电子笔记150(2006)9class Test {publicstatic void main(String[] args){ Consumer[] consumer = newConsumer[]{new Consumer(),new Consumer(),.};Resource[] resources = new Resource[]{new Resource(),new Resource(),.};table = new Table(consumers,resources);table.startDinner();//我想...Consumer newConsumer = new Consumer();Resource newResource = new Resource();table.addPhilosopher(newConsumer,newResource);//角色转换((table.Philoso ph erI mp l)n ew Consume r). st art();((table.Philoso ph erI mpl)n ew Con sume r). ea t();((table.Philosoph erI mp l)new Con sume r). intn =nk();//我想... ((table.Philoso phe rI mp l)newCon sum r). int a ta t();}}见图8。 主人是如何准备晚餐的。扮演其他角色。例如,一所学校可以在教学班级(另一个社会实体)中被表达出来,而这些班级反过来又被表达成学生的角色。通过这种方式,可以创建管理者和工人的层次结构,如IWIM模型所建议的那样[10,4,23]:在底层是不协调任何其它组件的组件工作者,而在上层是管理其它组件的组件(工作者或其它管理者)。5示例为了说明角色如何用于协调目的,我们使用了,以及Arbab [3],用餐哲学家的例子,在powerJava中展示它;我们通过在Java教程[26]中提出的实现中引入角色来做到这一点。为了充分解释角色的潜力,扩展用餐哲学家介绍一些重建问题。特别是,我们假设扮演哲学家角色的新组件和扮演筷子角色的新资源可以加入桌子,以及哲学家可以随时离开。该示例通过五种对象进行建模:(i) 餐桌,它构成了组件相互作用的环境,并协调它们。桌子是一种制度M. Baldoni等人理论计算机科学电子笔记150(2006)923它有两种角色:哲学家和筷子。(ii) 哲学家向消费者展示了他们的四种力量:抓住筷子后吃饭的方法(eat),思考的方法(think),开始吃饭的方法(start),以及离开餐桌的方法(leaveTable)。(iii) Chopstick为扮演角色的资源提供了一种方法,供其他组件使用(use)从扮演角色的资源中获取数据。(iv) 资 源 是 组 件 , 它 们 的 接 口 只 提 供 一 个 从 它 们 获 取 数 据 的 方 法(getData)。(v) 消 费 者 是 组 件 , 它 必 须 有 一 种 方 法 来 传 递 数 据 ( putData( Object input1 , Object input2 ) ) 并 对 它 们 执 行 计 算(processData)。桌子是一个协调环境,维持着一个有序的哲学家名单,他们拿着筷子坐在那里,并实现了这两个角色。它的构造函数接受两个数组,一个包含可以扮演哲学家角色的对象,另一个包含可以扮演哲学家角色的对象(在我们的示例中,一个Consumer和一个Resource实现了分别是PhilosopherReq和ChopstickReq接口)。 使用这些对象,该表创建所需角色的实例,将philoso他们围着桌子转,用筷子把他们连在一起(见图9)。Chopsticks和Philosophers的实现封装了将它们相互关联的字段(左和右)以及以并发方式访问共享资源的方法:隐藏到播放它们的组件中。然而,它们的权力确保组件以防止死锁和干扰的方式相互作用。具体地,角色Chopstick的实现ChopstickImpl不仅实现该角色的权力,而且还实现用于以同步方式抓取(抓取)和释放(释放)筷子的合适的私有方法。 这些方法阻止并重新激活访问已经被哲学家或桌子使用(所有者)的筷子的进程。请注意,这些方法是私有的,但是,由于它们是在内部类中定义的,因此它们对其他角色仍然是可见的(实际上,它们用于实现哲学家的权力,参见,例如,吃的方法)。角色Philosopher的实现PhilosopherImpl实现了吃、想、开始和离开表的权力。方法eat允许扮演哲学家角色的消费者参与到晚餐中,24M. Baldoni等人理论计算机科学电子笔记150(2006)9内 尔 。 该 方 法 首 先 获 取 筷 子 , 它 通 过 使 用 筷 子( left.use( ) 和right.use())获取预期的数据,然后以获得的信息作为参数调用putData观察消费者将在不知道信息源(一种信息渠道)的情况下最后,它会松开筷子。请注意,这个方法必须在角色内部定义,而不是在其播放器中定义,因为播放器组件不需要知道如何获取,使用和释放数据;组件使用数据,而数据源管理封装在角色中。换句话说,代表角色参与者的两个类只需要实现接口指定的方法作为其需求。这些类彼此之间没有任何引用,也没有引用它们交互的环境的协调结构:由于预编译阶段,所有这些方面都由它们所扮演的角色处理(参见图1中的底层模型)。图10显示了示例的序列图。Resource类实现了接口ChopstickReq,它包含获取数据的方法:getData 。 Consumer 类 实 现 接 口 PhilosopherReq , 这 允 许 它 扮 演Philosopher的角色。它实现了putData,以读取informa产生的数据,见图9。表是协调环境,资源和消费者之间的协调是通过角色来进行的。M. Baldoni等人理论计算机科学电子笔记150(2006)925见图10。 作用、机构和协调。public void addPhilosopher(PhilosopherReqphilReq,ChopstickReq chopReq){//我想...PhilosopherImpl phil0 =(PhilosopherImpl)phils.get(0); ChopstickImpl chop = phil0.left;chop.grab(this);phils.add(new PhilosopherImpl(philReq,phil0.left,newChopstickImpl(chopReq);phil0.left =((PhilosopherImpl)phils.get(phils.size()-1)).left; chop.release(this);//我想...}见图11。通过添加一位哲学家来重新布置餐桌的草图。数据源及其处理方法(processData)。 为了简单起见,我们在这里实现了同步通信,但是没有什么可以阻止实现异步版本,例如,通过向角色的状态添加缓冲器消费者通过将自己强制转换为表中的角色 来 访 问 其 角 色 PhilosopherImpl ,例 如 :图 8 中 的((table.PhilosopherImpl)newConsumer).start()。我 们 的 哲 学 家 能 够 使 用 方 法 addPhilosopher ( PhilosopherReqphilReq , ChopstickReqchopReq ) 和 Philosopher 的 方 法 leaveTable()。 addPhilosopher有两个对象作为参数,一个能够扮演Philosopher(图11)角色,另一个能够扮演Chopstick角色,并将它们添加到表的末尾。要做到这一点,基本上是桌子抓住了第一个哲学家(不是为了使用它们,而是为了防止别人使用它们)创造了一个新的哲学家和一个新的筷子角色,并调整了哲学家和他们的筷子之间的联系。最后,它释放保留的26M. Baldoni等人理论计算机科学电子笔记150(2006)9(现在分布在其余的哲学家)。与前一个方法相比,leaveTable(图12)是在消费者上以哲学家角色(参见图8中的main)直接调用的方法,以便离开表。图8中的main函数简单地构造了所需的Consumer和Resource数组,调用了Table的构造函数来创建协调环境,并开始了哲学家的晚餐。最后,它在表上添加另一个哲学家,调用addPhilosopher方法。开始计算新消费者所扮演的相应角色在适当的角色转换之后,过了一段时间,它通过调用leaveTable的作用:((table.PhilosopherImpl)newConsumer).leaveTable()总之,消费者组件和资源组件之间的交互是在不要求它们彼此知道以便能够调用它们的方法、知道它们所涉及的配置以及组件之间的连接(即,每个哲学家的筷子是什么,它们是如何分布在桌子周围的),以及如何重新构造这个系统。角色是将组件与系统以及组件之间联系起来的连接器。组成部分之间的相互联系可以被机构或角色本身改变,而组成部分仍然不知道这种重新配置。在我们的模型中,我们可以用另一个版本的组件替换任何组件,而无需更改任何其他组件或系统的协调方案。最后,独立于组件的计算部分的系统的协调方案也可以被更新,而不需要改变系统的组件。public void run(){//我想...inti= phils.lastIndexOf(this);PhilosopherImpl next=(PhilosopherImpl)phils.get((i+1)%(phils.size()- 1)); right.grab(this);phils.remove(i);next.left=this.left; right.release(this);done = true;//我想...}见图12。 一个哲学家如何离开桌子的草图。M. Baldoni等人理论计算机科学电子笔记150(2006)9276结论及相关工作在本文中,我们将介绍如何在面向对象语言中引入角色隐喻,以及如何在控制驱动的协调中使用它。组件对象之间的交互仅通过它们在构成交互环境的机构中所扮演的角色来实现,从而实现关注点的分离,并外生地协调系统的行为。我们展示了如何用角色扩展Java,以及如何使用由此产生的语言powerJava对哲学家用餐问题进行建模,重新配置的问题。 这个角色定义的许多特点-初始化起源于多智能体系统的研究领域。在[5]中讨论了这种关系的细节。正如Guillen-Scholten等人 [13]对通道所做的那样,我们扩展了Java,以展示如何在广泛使用的面向对象语言中以自包含的方式对组件进行建模。我们使用Sun公司提供的javaCC工具为powerJava语言实现了一个纯Java的预编译器。预编译器连同完整的示例,有关该语言及其到Java的翻译的更多信息可以在http://www.powerjava.org上找到。简单地说,每个角色指定被转换成两个接口,而角色实现被转换成内部类,其构造函数被适当地扩展。玩家被修改以管理角色列表,角色转换被转换为指令,允许在这些列表中找到相应的角色(使用角色的名称和机构的实例),然后委派此任务执行权力的对象。角色定义与通信协议的规范有很强的关系[17,15]。事实上,角色(作为被赋予权力的实体)是协调组织内行为的一种手段。扮演一个角色意味着获得特定的权力(由组织赋予);玩家根据获得的权力进行互动。换句话说,参与者遵循机构及其角色实施的协议,以便相互作用。制度本身是协议的抽象。协议作为制度可以收集在一起,以构成一个图书馆的协议(协调模式)。设计者必须验证和证明他们的协调模式的属性只有一次[27],指定哪些需求应该得到满足,以发挥在协议中涉及的作用(被powerJava中使用的角色概念与Omicini [21]开发的代理协调上下文的概念有一些相似之处。Agent协调上下文基于控制室隐喻。根据这个
下载后可阅读完整内容,剩余1页未读,立即下载
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 京瓷TASKalfa系列维修手册:安全与操作指南
- 小波变换在视频压缩中的应用
- Microsoft OfficeXP详解:WordXP、ExcelXP和PowerPointXP
- 雀巢在线媒介投放策划:门户网站与广告效果分析
- 用友NC-V56供应链功能升级详解(84页)
- 计算机病毒与防御策略探索
- 企业网NAT技术实践:2022年部署互联网出口策略
- 软件测试面试必备:概念、原则与常见问题解析
- 2022年Windows IIS服务器内外网配置详解与Serv-U FTP服务器安装
- 中国联通:企业级ICT转型与创新实践
- C#图形图像编程深入解析:GDI+与多媒体应用
- Xilinx AXI Interconnect v2.1用户指南
- DIY编程电缆全攻略:接口类型与自制指南
- 电脑维护与硬盘数据恢复指南
- 计算机网络技术专业剖析:人才培养与改革
- 量化多因子指数增强策略:微观视角的实证分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)