你与公司是怎样的依赖公共关系公司

供应链企业资源依赖与供应链权力的关系-冯毅_郑静静
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
供应链企业资源依赖与供应链权力的关系-冯毅_郑静静
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口|||||| 更多
比特客户端
我们也在这里:
流程变革中的专家解析:流程模型的依赖关系
关键字:专家
  流程的建模方法很多,这些方法从不同的,对流程的要素进行描述。常见的流程建模方法主要描述业务逻辑,突出流程的行为之间的依赖关系。基于角色的流程模型强调流程的组织要素。其中相邻的角色之间是顾客(内部顾客或外部顾客)和服务者的关系,便于实施以顾客为中心的战略。
  作为一个多角色合作、多种力量(目标、期望和兴趣等)交织在一起的有机系统,流程参与者之间的依赖关系很多,大致包括活动逻辑、交流(communication)和意图关系(intentional relationship)等多种联系。上述联系很难在一个视图中完整反映出来,不同的建模方法一般会突出不同的方面,一个模型也会隐含地包括起其他模型的要素,而且可以由一个视图导出其他视图。下面分析几种典型的建模方法,说明角色的几种依赖关系:
  1、SADT
  常用的流程描述方法。用活动及其逻辑关系表示流程,有时也会在活动图示旁标注执行角色,有些模型,如IDEF0等也会反映资源约束,但隐含了角色之间的目标共享和交流,动机和意图也很难显性表示。
  2、通讯结构模型
  基于通讯(communication)的流程描述方法,如Action-Workflow建模方法。虽然活动执行者在如何具体完成任务方面有一定的自由度,但个体的目标应服从组织整体需要。相邻活动的执行者之间是请求服务的关系,前一个活动的输出是后一个活动的输入。因此相邻活动的主体之间需要就服务内容和质量达成协议―执行者向顾客承诺(commitment),而不简单是结果的传递。通讯结构模型可以把SADT的活动转化为相关的两个角色协商过程(准备、协商、实施和接受四个阶段),其中第三个阶段包括了活动,隐含了活动的逻辑顺序和角色之间的目标关系等内容。此模型的局限在于把工作流(流程的)视为若干参与者对的交互关系集,虽然通讯发生在两个参与者之间,但期望可能来自不同方面[2]。
  3、意图关系模型
  战略依赖模型(strategy dependency model)的核心思想,强调了组成流程的角色的目标、任务和资源等依赖关系,淡化了角色交互、角色活动和活动的逻辑。依赖的强弱也有多种,如弱相关和强相关。弱关系是指执行者提供的结果(信息、资源或服务)不能满足顾客的要求时,会对顾客的后续工作没有干扰或有部分影响;强相关则表示影响很大,甚至无法开始。就表达流程内容的层次而言,意图关系模型站得高一些,蕴涵了执行者之间的交流,对执行者的活动也有一定的约束。
  上述几种模型表达流程角色的依赖关系侧重点不同,但在内容上是互补的,完整的依赖关系可以结合几种方法。在流程变革中,利用信息技术,改变活动的、通讯的依赖是基本做法,但深层的变革更涉及到流程角色的意图关系变化。由于角色之间意图关系往往呈现复杂的网状关系,而问题经常出现在依赖关系比较复杂的角色之间交互界面上,所以组织深度的变革难度一般都很大。(完)
[ 责任编辑:高守 ] &&&&
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte如何解决依赖性问题? - Jan5 - 推酷
如何解决依赖性问题? - Jan5
不管是初步跨入Linux殿堂的新手,还是具有多年经验的专家,在安装或编译软件包的过程中或多或少的都会遇到包的依赖问题,从而导致安装过程无法继续,比如管理员在安装LAMP时,包需要libgd.so文件,而这个文件属于GD软件包。但是在安装GD软件包时,可能这个软件包跟其他软件包又具有依赖关系,又需要安装其他软件包才行。这时有的管理员便失去耐心。在遇到这种Linux软件包依赖关系问题时,该如何解决呢?在谈这个具体的措施之前,先跟大家聊聊Linux系统里的软件依赖性问题。
一、什么是依赖性
程序依赖于程序代码的共享库,以便它们可以发出系统调用将输出发送到设备或打开文件等(共享库存在于许多方面,而不只局限于系统调用)。没有共享库,每次程序员开发一个新的程序,每个程序员都需要从头开始重写这些基本的系统操作。当编译程序时,程序员将他的代码链接到这些库。如果链接是静态的,编译后的共享库对象代码就添加到程序执行文件中;如果是动态的,编译后的共享库对象代码只在运行时需要它时由程序员加载。动态可执行文件依赖于正确的共享库或共享对象来进行操作。rpm依赖性尝试在安装时强制实施动态可执行文件的共享对象需求,以便在以后当程序运行时不会有与动态链接过程有关的任何问题。
注意:还有一种类型的依赖性,它基于显式的条目,rpm通过程序员将该依赖性强加到rpm配置文件中,但目前我们不关心这种类型的依赖性,这种依赖性比较容易解决。这里将重点放在rpm强制实施的更加复杂的共享对象依赖性。
二、动态可执行文件和共享对象
动态可执行文件使用最初编译和链接程序时使用的库文件的共享对象名称来查找共享对象。它们在少数的几个标准位置查找,比如在/lib和/usr/lib目录及在LD_LIBRARY_PATH环境变量(主要用于指定查找共享库,比如我们在安装Oracle时指定路径,export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib)指定的目录中。顺便提一下,在这些库目录中找到的共享对象可能不是真正的文件;它们可能是指向位于其他位置的真实库文件的符号链接(但通常仍旧在标准库目录的一个目录中)。至少从系统管理员的观点是在用于创建共享库文件的共享库软件包的名称和共享库文件的名称之间通常没有什么关系。例如,GLIBC 2.3软件包用于创建libc.so.6共享库文件。也从本示例中注意到,添加到共享库文件名结束的版本号(.6)跟用于创建它的版本号(2.3)没有关系。这是由共享库软件包开发人员有意完成的,以便GLIBC的新版本可以重用相同的共享库文件名libc.so.6。这允许您在系统上加载新版本的GLIBC,而不用中断动态链接到lib.so.6共享库文件的所有程序,当然假定新版本的GLIBC向后与动态可执行文件最初所链接的老版本GLIBC兼容。因此,即使库文件或共享对象文件有与它们相关的版本号,这些版本号也不能帮助你确定他们来自哪个版本的共享软件包。
注意:当将whatprovides选项用于rpm查询命令时,可以获得有关使用rpm软件包加载到系统的现有共享对象的信息。这种混乱是由下面的事实造成的:单个共享库文件可能支持某个范围的共享库软件包版本。例如,要检查soname库文件/lib/libc.so.6支持的GLIBC共享库软件包,运行下面的命令:
#objdump --all-headers /lib/libc.so.6 | less
向下滚动此报告,直到到达Version definitions: 部分,以便查看libc.so.6共享库文件支持哪些GLIBC版本:
Version definitions:
1 0x01 0x libc.so.6
2 0x00 0x0d696910 GLIBC_2.0
3 0x00 0x0d696911 GLIBC_2.1
4 0x00 0x09691f71 GLIBC_2.1.1
5 0x00 0x09691f72 GLIBC_2.1.2
GLIBC_2.1.1
6 0x00 0x09691f73 GLIBC_2.1.3
GLIBC_2.1.2
7 0x00 0x0d696912 GLIBC_2.2
GLIBC_2.1.3
8 0x00 0x09691a71 GLIBC_2.2.1
9 0x00 0x09691a72 GLIBC_2.2.2
GLIBC_2.2.1
10 0x00 0x09691a73 GLIBC_2.2.3
GLIBC_2.2.2
11 0x00 0x09691a74 GLIBC_2.2.4
GLIBC_2.2.3
12 0x00 0x09691a76 GLIBC_2.2.6
GLIBC_2.2.4
13 0x00 0x0d696913 GLIBC_2.3
GLIBC_2.2.6
14 0x00 0x GLIBC_2.3.2
15 0x00 0x GLIBC_2.3.3
GLIBC_2.3.2
16 0x00 0x GLIBC_2.3.4
GLIBC_2.3.3
17 0x00 0x0d696914 GLIBC_2.4
GLIBC_2.3.4
18 0x00 0x0d696915 GLIBC_2.5
19 0x00 0x0963cf85 GLIBC_PRIVATE
20 0x00 0x0b792650 GCC_3.0
在本示例中,1ibc.so.6共享库文件支持原先为GLIBC版本2.0到2.5而开发的所有动态执行文件。注意:也可以使用objdump命令来从共享库文件中提取soname,命令如下所示:
# objdump --all -headers /lib/libcrypto.so.0.9.8b| grep SONAME
SONAME libcrypto.so.6
objdump: /lib/libcrypto.so.0.9.8b: no recognized debugging information
接下来,将讨论rpm软件包是如何生成的,以便在新系统上安装rpm软件包时,这些共库依赖性是己知的。
三、Rpm软件包和共享库依赖性
当程序员生成rpm软件包时,ldd命令用于报告动态可执行文件软件包中所有动态可执行文件使用的所有共享库。另一个混乱是由下面的事实带来的:相同软件包中的不同动态可执行文件可能与相同的共享库软件包的不同版本进行链接。例如,Heartbeat软件包中的不同程序可能已经进行了开发,并动态链接到libc.so.6 sonmae共享库文件的不同GLIBC版本。对rpm命令使用-q和--requires参数,可以看到rpm软件包需要的共享库的完整清单。例如,要看到Heartbeat rpm软件包所有的所需依赖性,请使用命令:
#rpm -q --requires -p heartbeat-1.x.x.i386.rpm
这产生了下面的报告:
/usr/bin/python
ld-linux.so.2
libapphb.so.0
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libccmclient.so.0
libdl.so.2
libglib-1.2.so.0
libhbclient.so.0
libpils.so.0
libplumb.so.0
libpthread.so.0
librt.so.1
libstonith.so.0
注意,在此报告中,libc.so.6 soname是所需要的,此共享库必须支持使用GLIBC共享软件包版本号2.0、2.1、2.1.3、2.2和2.3进行链接的动态可执行文件。这是由下面的事实决定的:Heartbeat软件包中的不同动态可执行文件是针对不同版本的libc.so.6库的每个版本进行链接的。在了解了动态可执行文件、共享对象、soname和共享库软件包彼此是如何相关的后,下面准备来看这样的一个例子:当尝试安装rpm软件包,并且它由于依赖性错误而失败时,会发生什么。yum能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
四、手工解决依赖性问题
通常,当尝试安装发行版中没有包括的软件包(及不能由像up2date、apt- get或Yum一样的更新工具自动解决其依赖性的软件包)时,将碰到rpm依赖性错误。例如,如果尝试在老的Linux发行版上使用rpm –ivh *rpm命令,例如所有的Heartbeat rpm包,那么在安装过程中就可能碰到下面的错误:
error: failed dependencies:
libc.so.6(GLIBC_2.3) is needed by heartbeat-1.x.x
libc.so.6(GLIBC_2.3) is needed by heartbeat-pils-1.x.x
libcrypto.so.0.9.6 is needed by heartbeat-stonith-1.x.x
libsnmp-0.4.2.6.so is needed by heartbeat-stonith-1.x.x
注意,rpm命令没有干扰报告所需的每个GLIBC共享库软件包版本号——它只报告所需的最高编号的版本号(GLIBC_2.3)。(假定原来的软件包开发人员不会将相同软件包中的可执行文件链接到不兼容版本的共享库软件包)所有的这些故障都报告所需的共享库名称或soname(而不是文件名称,soname始终以“lib”开始)。但可以删除添加到rpm报告的soname结束的版本号,并快速检查以查看是否在系统中使用locate命令安装这些共享库(假设您的locate数据库是最新的,有关更多信息,请参阅locate或slocate的手册页)。例如,要查找libcrypto享库文件,要输入:
#locate libcrypto
[root@localhost ~]# locate libcrypto
/lib/libcrypto.so.0.9.8b
/lib/libcrypto.so.6
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/libcrypto.a
/usr/lib/libcrypto.so
/usr/lib/pkgconfig/libcrypto.pc
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
如果此命令没有在系统上找到一个libcrypto共享库文件,将需要转到Internet并找出哪个共享库软件包包含此共享库文件。完成此项工具的一个快速和简便方式是只要在http://rpmfind.net上将共享库的名称输入到搜索栏中。如果将文本libcrypto.so输入到此搜索贞中,将很快知道此共享库是由openssl软件包提供的。
如果老版本的共享库数据包已经安装在系统上,可以用如下的命令确认此软件包含您需要的共享库文件:
#rpm -q --provides openssl
[root@localhost ~]# rpm -q --provides openssl
config(openssl) = 0.9.8b-10.el5
lib4758cca.so
libatalla.so
libchil.so
libcrypto.so.6
libcswift.so
libnuron.so
libssl.so.6
libsureware.so
libubsec.so
openssl = 0.9.8b-10.el5
此命令报告此rpm软件包中提供的所有内容(这包括软件包提供的共享库文件的soname)。注意:如前面指出的,共享库软件包版本号没有并且应该没有与共享库文件( soname)版本号的任何对应关系。这里不进行这方面的讨论,因为soname符号链接可能指向不同版本的共享库文件,这也是在尽量避免在安装新版本的共享软件包时中断现有动态可执行文件的情况下完成的。
五、自动解决依赖性故障
当您使用rpm软件包来生成、升级或添加新的特性到系统时,依赖性故障可能很快变成一场恶梦。只要通过使用您的发行版供应商的升级服务或工具,就可以避免这场恶梦。例如,当选择要安装的rpm软件包时,Red Hat工具up2date自动从Red Hat下载并安装所有rpm依赖性。下面就点上列出了几个完成相同事情的支持社区的免费方法:http://www.rpm.org/。下面将只进一步看到这些自动更新工具中的一种:Yum。
1.使用Yum来安装rpm软件包
Yum(Yellow dog Updater,Modified)程序可从下面网址下载:http://yum.baseurl.org/download/3.4/yum-3.4.3.tar.gz
在下载了此软件包后,可以使用下面的命令像任何其他rpm软件包那样安装它:
#rpm -ivh yum*
您可能需要更新想用于下载您的rpm软件包的存储库。有关Fedora的可用Yum存储库的清单在http://www.fedoratracker.org要切换到不同的存储库,下载这些文件中的一个文件,并将该文件作为/etc/yum.conf文件安装。现在可以用下面的命令告诉Yum报告存储在Yum存储库中、可用于安装所有软件包:
[root@localhost ~]# yum list |more
This system is not registered with RHN.
RHN support will be disabled.
Loading &security& plugin
Loading &rhnplugin& plugin
Installed Packages
Deployment_Guide-en-US.noarch 5.2-9 installed
Deployment_Guide-zh-CN.noarch 5.2-9 installed
Deployment_Guide-zh-TW.noarch 5.2-9 installed
GConf2.i386 2.14.0-9.el5 installed
GConf2-devel.i386 2.14.0-9.el5 installed
ImageMagick.i386 6.2.8.0-4.el5_1.1 installed
MAKEDEV.i386 3.23-1.2 installed
MySQL-python.i386 1.2.1-1 installed
NetworkManager.i386 1:0.6.4-8.el5 installed
NetworkManager-glib.i386 1:0.6.4-8.el5 installed
2.用Yum安装新的rpm软件包
在本示例中,将安装新的GLIBC软件包。用简单的命令安装最新的GLIBC及其所有依赖性:
#yum update glibc
如果一切正常,Yum程序将自动检测、下载并安装最新GLIBC软件包所需要的所有rpm软件包(这里的GLIBC软件包是为您的发行版而构建的,不一定是可用的最新版GLIBC软件包(使用发行版所批准的GLIBC共享库软件包版本号或冒险安装没有使用正常系统操作所需要的动态可执行文件的GLIBC软件包版本)。也可以将list参数用于Yum和grep命令来查找要安装的软件包。例如,要查找名称中有SNMP的软件包,请输入:
# yum list |grep snmp
此命令返回如下报告:
This system is not registered with RHN.
RHN support will be disabled.
net-snmp.i386 1:5.3.1-24.el5 installed
net-snmp-libs.i386 1:5.3.1-24.el5 installed
net-snmp-perl.i386 1:5.3.1-24.el5 installed
net-snmp-utils.i386 1:5.3.1-24.el5 installed
现在可以容易地使用YUM下载并安装所有这些rpm软件包。
六、关于升级Gilbc的建议
Glibc 库是Linux 底层的运行库,其性能对于整个系统的运行有重要的意义。Glibc 库包含了大量函数,其中的函数可大致分成两类,一类是与操作系统核心沟通的系统调用接口,它们作为功能型函数被调用,提供对Linux 操作系统调用的包装与预处理。另外一类为一般的函数对象,它们提供了经常使用的功能的实现,作为工具型函数使用。在实践中,有不少软件就是依赖与Glibc版本才能安装并运行,说白了对于Glibc版本要求是版本高了不行,低了还不成。这些编译环境中的应用程序也和其它程序一样必须有运行的环境,我常遇到管理员在生产中给服务器装了最新的Linux发行版,结果应用软件装不上去,原因是Glibc的版本不对,有的是写在原发行版glibc上升级有的是降级,结果倒是整个系统的崩溃,实践经验告诉我,你只有选择相应Linux发行版里对应的glibc,例如我们单位的一个应用软件时在rhel3.0下开发的,那么就得要对应的发行版,换了别的就难说了,任何自己升级或降级Glibc来适应应用软件的做法都是不可取的,问题最后的解决方法是找到了RHEL3装上就解决了。在表一中,我把几个linux发行版原配的Glibc版本列出,供大家参考。
点击图片查看大图
Glibc库与核心功能组件
上图一说明:
GCC依赖于glibc
binutils依赖于glibc (binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编)
make依赖于glibc
头文件是在编译时候gcc所需要的,但本身都是一些文本文件,因此没有需要的运行环境。
常用工具依赖于glibc和各种需要用到的动态库。
下表一列出了多个重要Linux发行版的Glibc的情况
Linux发行版 Glibc版本
Redhat 9 glibc-2.3.2-5
Fedora 1 glibc-2.3.2
Redhat Enterprise Linux As 3 glibc-2.3.2-95
Redhat Enterprise Linux As 4 glibc-2.3.4
Red hat Enterprise linux 5 glibc-2.5-24
Red hat Enterprise linux 6 glibc-2.9
Centos 5.x glibc-2.5
Suse Linux Enterprise Server 9 glibc-2.3.2-92
Suse Linux enterprise Server 10 glibc-2.4.31.54
Suse Linux Enterprise Server 11 glibc-2.9
点击图片查看大图
Linux发行版glibc (32)位
下面介绍几个查询glibc版本号的方法 :
#ls –al /lib/libc*
或者是用下面的命令也可以实现
#rpm –qp |grep glibc
基于debian的系统通过dpkg –l | grep libc6也可以查到,总之一般都在/usr/share/doc目录下都能看到glibc的相关信息。
大部分情况下,在遇到软件包依赖关系问题的时候,操作系统提供的文件名字与软件包名字都会有直接的联系。有可能文件的名字就是软件包的名字。但是有些时候文件的名字与软件包的名字会相差甚远。此时大部分系统管理员可能光凭文件名字无法找到对应的软件包。此时可以先在系统安装光盘里找,如果找到那时最佳选项,然后就需要借助笔者上面谈到的一些专业网站,去查询软件包的名字了。当系统管理员安装了某个软件之后,如果存在软件包之间的依赖关系,则最好能够拿本子或者通过其他手段记录下来。以便下次方便实用,注意工作中的积累,相信绝大部分的软件包依赖关系问题都会迎刃而解。
本文出自 “李晨光原创技术博客” 博客,请务必保留此出处http://chenguang./4095
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合) - 四把刷子 - 博客园
随笔 - 150, 文章 - 0, 评论 - 39, 引用 - 0
继承、实现、依赖、关联、聚合、组合的联系与区别
分别介绍这几种关系:
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;
但总的来说,后几种关系所表现的强弱程度依次为:组合&聚合&关联&依赖;
聚合跟组合其实都属于关联 只不过它们是两种特殊的关联 因为本是同根生 所以它们之间难免会有相似之处 下面让我们一起来看一下它们之间有何不同
聚合与组合的概念相信不用我在此赘述大家就已经了解了 下面直接上例子
程老师的《大话》里举大那个大雁的例子很贴切 在此我就借用一下 大雁喜欢热闹害怕孤独 所以它们一直过着群居的生活 这样就有了雁群 每一只大雁都有自己的雁群 每个雁群都有好多大雁 大雁与雁群的这种关系就可以称之为聚合 另外每只大雁都有两只翅膀 大雁与雁翅的关系就叫做组合 有此可见 聚合的关系明显没有组合紧密 大雁不会因为它们的群主将雁群解散而无法生存 而雁翅就无法脱离大雁而单独生存&&组合关系的类具有相同的生命周期
聚合关系图:
组合关系图:
从从代码上看这两种关系的区别在于:
构造函数不同
public class GooseGroup&
public GooseGroup(Goose goose)&
&&&&&&& {&
this.goose =&
&&&&&&& }&
public class GooseGroup&
public GooseGroup(Goose goose)&
&&&&&&& {&
this.goose =&
&&&&&&& }&
public class Goose&
public Goose()&
&&&&&&& wings=new Wings();&
public class Goose&
public Goose()&
&&&&&&& wings=new Wings();&
聚合关系的类里含有另一个类作为参数
雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来 大雁类(Goose)可以脱离雁群类而独立存在& 组合关系的类里含有另一个类的实例化
大雁类(Goose)在实例化之前 一定要先实例化翅膀类(Wings) 两个类紧密耦合在一起 它们有相同的生命周期 翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在
信息的封装性不同
在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的
而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。
-------------------------------------------------------------------------------------------------------
UML-泛化、关联、聚合、组合、依赖
一、泛化关系(generalization)
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。
父类 父类实例=new 子类();
class Animal{};
class Tigger : public Animal{};
class Dog : public Animal{};
Animal* pAnimal = new D
二、关联关系(association)
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
表示类与类之间的联接,有双向关联和单向关联,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向。
关联关系以实例变量的形式存在,在每一个关联的端点,还可以有一个基数(multiplicity),表明这一端点的类可以有几个实例。
双向关联在代码的表现为双方都拥有对方的一个指针,当然也可以是引用或者是值。
关联关系是使用实例变量来实现。
//单向关联
class Person{};
class Friend
Person* mpP
//双向关联
//自身关联
三、聚合关系(aggregation)
关联关系的一种,是强的关联关系。聚合是整体和个体的关系。聚合关系也是通过实例变量实现的。例如汽车、发动机、轮胎,一个汽车对象由一个发动机对象,四个轮胎对象组成。
当类之间有整体-部分关系的时候,我们就可以使用组合或者聚合。
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
class CPU{};
class Memory{};
class Computer
CPU* mpCPU;
Memory* mpM
四、组合关系(合成关系)(composition)
合成关系也是关联关系的一种,是比聚合关系更强的关系。合成关系是不能共享的。例如人有四肢、头等。
表示类之间整体和部分的关系,组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
//同聚合关系,不过说语义不同
class Leg{};
class Arm{};
class Person
五、依赖关系(Dependency)
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
与关联关系不同的是,依赖关系是以参数变量的形式传入到依赖类中的,依赖是单向的,要避免双向依赖。一般来说,不应该存在双向依赖。
依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是&uses&了那个类),就可以把这种关系看成是依赖。
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
class Car{};
class House{};
class Person
void buy(Car& car){}
void buy(House* pHouse){}
六、关系之间的区别
1.聚合与组合
(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
(2)部件的生命周期不同
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
(3)聚合关系是&has-a&关系,组合关系是&contains-a&关系。
2.关联和聚合
(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
3.关联和依赖
(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。
4.综合比较
这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:
组合&聚合&关联&依赖;
-----------------------------------------------------------------------------------------------------------------------------------------------
UML 线条 箭头
后面的例子将针对某个具体目的来独立地展示各种关系。虽然语法无误,但这些例子可进一步精炼,在它们的有效范围内包括更多的语义。
依赖(Dependency)
实体之间一个&使用&关系暗示一个实体的规范发生变化后,可能影响依赖于它的其他实例(图D)。 更具体地说,它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。其中包括一个局部变量,对通过方法调用而获得的一个对象的引用(如下例所 示),或者对一个类的静态方法的引用(同时不存在那个类的一个实例)。也可利用&依赖&来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的 各个类之间的关系,表示出包和包的关系。
关联(Association)
实体之间的一个结构化关系表明对象是相互连接的。箭头是可选的,它用于指定导航能力。如果没有箭头,暗示是一种双向的导航能力。在Java中,关联(图E) 转换为一个实例作用域的变量,就像图E的&Java&区域所展示的代码那样。可为一个关联附加其他修饰符。多重性(Multiplicity)修饰符暗示 着实例之间的关系。在示范代码中,Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个 Employee。
聚合(Aggregation)
聚合(图F)是关联的一种形式,代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。聚合也转换成Java中的一个实例作用域变量。
关联和聚合的区别纯粹是概念上的,而且严格反映在语义上。聚合还暗示着实例图中不存在回路。换言之,只能是一种单向关系。
合成(Composition)
合成 (图G) 是聚合的一种特殊形式,暗示&局部&在&整体&内部的生存期职责。合成也是非共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局 部的存活状态,要么负责将其销毁。局部不可与其他整体共享。但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。
Employee和TimeCard的关系或许更适合表示成&合成&,而不是表示成&关联&。
泛化(Generalization)
泛化(图H)表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中,用extends关键字来直接表示这种关系。
实现(Realization)
实例(图I)关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。
-----------------------------------------------------------------------------------------------------------------------------------------------
UML类图关系主要有关联,依赖,泛化,实现等,那么它们的表示方法你是否熟悉,本文就像大家介绍一下UML类图关系的表示方法。
本节和大家一起学习一下UML类图关系的表示方法,主要包括关联,聚合,泛化,实现,依赖等内容,希望通过本节的学习大家对UML类图关系的表示方法有一定的掌握。下面是具体介绍。
1:UML类间关系的种类
UML类图关系中关联描述了系统中对象或实例之间的离散连接,关联带有系统中各个对象之间关系的信息。
2.1关联表示法
2.2聚集与组合
3:泛化,继承【Generalization】
UML类图关系中泛化关系是类元的一般描述和具体描述之间的关系,具体描述建立在一般描述的基础之上,并对其进行了扩展。
4:实现【realization】
UML类图关系中实现关系将一种模型元素(如类)与另一种模型元素(如接口)连接起来,其中接口只是行为的说明而不是结构或者实现。
5:依赖【Dependence】
UML类图关系中依赖表示两个或多个模型元素之间语义上的关系。它只将模型元素本身连接起来而不需要用一组实例来表达它的意思。它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。
5.1依赖的种类
访问:允许一个包访问另一个包【access】
绑定:为模板参数赋值以生成一个新的模型元素【bind】
调用:声明一个类调用其他类的方法【call】
导出:声明一个实例可以从另一个实例中到处【derive】
友元:允许一个元素访问另一个元素而不论被访问元素的可见性【friend】
引入:允许一个包访问另一个包的内容并未被访问包的组成部分添加别名【import】
实例化:关于一个类的方法生成了另一个类的实例的生命【instantate】
参数:一个操作和他参数之间的关系【parameter】
实现:说明和其实之间的映射关系【realize】
精化:声明具有两个不同层次上元素的映射关系【refine】
发送:信号发送者和信号接受者之间的关系【send】
跟踪:声明不同模型中元素之间的连接,没有映射精确【trace】
使用:声明使用一个模型元素需要已存在的另一个模型元素,这样才能正确实现使用者的功能(调用,实例化,参数,发送)【use】
UML类图关系中约束可以用来表示各种非局部的关系,如关联路径上的限制。约束尤其可以用来表述存在特性(存在X则C条件成立)和通用特性(对于Y中的所有y,条件D必须成立)。
实例是有身份标识的运行实体,即它可以与其他运行实体相区分。它在任何时刻都有一个值,随着对实例进行操作值也会被改变。
-----------------------------------------------------------------------------------------------------------------------------------------------
类与类之间存在以下关系:
(1)泛化(Generalization)
(2)关联(Association)
(3)依赖(Dependency)
(4)聚合(Aggregation)
UML图与应用代码例子:
1.泛化(Generalization)
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。
[具体表现]
父类 父类实例=new 子类()
[UML图](图1.1)
图1.1 Animal类与Tiger类,Dog类的泛化关系
[代码表现]
class Animal{}&& class Tiger extends Animal{}&& public class Test&& {&& &&& public void test()&& &&&& {&& &&&&&&&& Animal a=new Tiger();&& &&&& }&& }& 2.依赖(Dependency)
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
[具体表现]
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
[现实例子]
比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作
[UML表现](图1.2)
图1.2 Person类与Screwdriver类的依赖关系
[代码表现]
public class Person{&& &&& /** 拧螺丝 */& &&& public void screw(Screwdriver screwdriver){&& &&&&&&&& screwdriver.screw();&& &&&& }&& }& 3.关联(Association)
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
[具体表现]
关联关系是使用实例变量来实现
[现实例子]
比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司
[UML图] (图1.3)
图1.3 公司和员工的关联关系
[代码表现]
public class Company{&& &&& private E&& &&& public Employee getEmployee(){&& &&&&&&&&& &&&& }&& &&& public void setEmployee(Employee employee){&& &&&&&&& this.employee=&& &&&& }&& &&& //公司运作&& &&& public void run(){&& &&&&&&&& employee.startWorking();&& &&&& }&& }& (4)聚合(Aggregation)
当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。
[具体表现]
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
[关联与聚合的区别]
(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。
聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。
(2)对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的 对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和内存) 拆了下来。
[UML图](图1.4)
图1.3 电脑和组件的聚合关系
[代码表现]
public class Computer{&& &&& private CPU&& &&& public CPU getCPU(){&& &&&&&&&&& &&&& }&& &&& public void setCPU(CPU cpu){&& &&&&&&& this.cpu=&& &&&& }&& &&& //开启电脑&& &&& public void start(){&& &&&&&&& //cpu运作&& &&&&&&&& cpu.run();&& &&&& }&& }
-----------------------------------------------------------------------------------------------------------------------------------------------
类图及类图中的关系
1.类图和对象图&
&&& 类图(Class Diagram)是显示出类、接口以及他们之间的静态结构与关系的图。其中最基本的单元是类或接口。
&&& 类图不但可以表示类(或者接口)之间的关系,也可以表示对象之间的关系。下面是一个典型的类图:
&&& 类图一般分为几个部分:类名、属性、方法。下面分别讲解。
&&& (1)类名
&&& 上面的Car就是类名,如果类名是正体字,则说明该类是一个具体的类,如果类名是斜体字,则说明类是一个抽象类abstract。
&&& (2)属性列表
&&& 属性可以是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。当然,这只是一种表现方式。我是用的是Rational Rose,如果用的是别的软件,还可能使用+、-、#表示:+代表public、-代表private、#代表protected。
&&& (3)方法列表
&&& 方法可以是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。当然,这只是一种表现方式。我是用的是Rational Rose,如果用的是别的软件,还可能使用+、-、#表示:+代表public、-代表private、#代表protected。
&&& 对于静态属性,属性名会加上一条下划线。如上图所示。
&&& 此外,类图既能表示类之间的关系,还能表示对象之间的关系。二者的区别是:对象图中对象名下面会加上一条下划线。
2.类图中的关系
&&& (1)Generalization:泛化、一般化
&&& Generalization表示的是类与类之间的继承关系、接口与接口之间的继承关系、类与接口之间的实现关系。如果体现到Java语言中,那就是反应extends和implements关键字。其典型类图如下所示:
&&& (2)Association:关联关系
&&& 关联关系描述的是类与类之间的连接,他表示一个类知道另一个类的属性和方法。关联关系可以是单向的或者双向的。在Java语言中,单向的关联关系是通过以实例变量的方式持有被关联对象的引用来实现的。一般来说是不建议使用双向的关联关系的。下面举例介绍单向的关联关系。
&&& 上面的类图表现的是骑手和马之间的关系。Rider中有一个实例变量类型是Horse。
&&& 每个连接都会有两个端点,上面的Rider和Horse就是端点,且每个端点都可以有(optional)一个基数(multiplicity),表示这个类可以有几个实例。这个类似于数据库中的1:n、m:n这些关系。我们可以给上面的例子加上基数:
&&& 上面表示的是骑手与马之间的1对n关系。
&&& (3)Aggregation:聚合关系
&&& 聚合关系是关联关系的一部分,是非常强的关联关系。聚合关系表现的更多的是整体与部分的关系。例如汽车和车门、发动机之间的关系。如图所示:
&&& 与关联关系一样,聚合关系也是通过实例变量实现的。单纯从语法的角度基本上无法判断出关联关系和聚合关系。
(4)Composition:组合关系
&& 组合关系同样也是关联关系中的一种,这种关系是比聚合关系更加强的关系。我们前面提到,聚合关系表现的是整体与部分之间的关系,组合关系是在聚合关系的基础上,表示不可分割的整体与部分之间的关系。也就是说表示整体的对象需要负责表示部分的对象的生命周期。
&& &代表整体的对象负责保持代表部分的对象的存活,在一些情况下负责将代表部分的对象湮灭掉。代表整体的对象某些时候可以将代表部分的对象传递给另外一个对象,并由它负责代表部分的对象的生命周期。换言之,代表部分的对象同一时刻只能与一个对象构成组合关系。并且由后者排他的负责其生命周期。&&&《Java与模式》
&& 我们以人和手臂的关系举例,组合关系的类图如下:
&& (5)Dependency:依赖关系
&& 依赖关系表示一个类依赖于另一个类的定义。依赖关系是单方向的。人吃苹果,那么人依赖苹果。类图如下:
&& 一般来说,被依赖的对象往往是以局部变量、方法参数的形式存在于来对象中,与关联关系不同,它不会以成员变量的形式存在于以来对象中。这一点值得注意。另外,每一个依赖都有一个名称。上面这个依赖关系的名称就是eats。
&& 以上就是类图和常见的类图之间的关系。

我要回帖

更多关于 依赖关系图 的文章

 

随机推荐