角色模式

Copyright © TeleManagement Forum 2013. All Rights Reserved.

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to TM FORUM, except as needed for the purpose of developing any document or deliverable produced by a TM FORUM Collaboration Project Team (in which case the rules applicable to copyrights, as set forth in the TM FORUM IPR Policy, must be followed) or as required to translate it into languages other than English.

上图定义了一个交换机(Switch)和一个路由器(Router),二者作为物理设备(PhysicalDevice)的子类(继承方式)。交换机和路由器的基本区别是前者转发流量,后者路由并转发流量。但是对于一台具有路由功能的三层交换机如何处理呢?一种可能的方式是在上图中为交换机(Switch)创建一个子类Layer3Switch。但这是一个不好的方案,因为每当路由技术更新换代时,这个模型中的路由器(Router)和三层交换机(Layer3Switch)都随之需要更新;另外这种方案中的三层交换机与路由器并没有多大区别。如果出现了四层交换机(Layer4Switch),那么又如何为之建模呢?路由器、Layer3Switch和Layer4Switch的路由类型又如何区分呢?如何处理带有防火墙功能的路由器呢?类似的问题是很多的。可见,多重继承的方式并不能解决这类问题。

对于以上问题,我们可以采用一种更加优雅的方式解决——角色模式。

角色模式是增强模型可扩展性的基本方式。角色模式将一个实体的各种功能抽象为不同的对象,而不是将其功能嵌在实体本身中,例如角色模式可以将一个设备的不同功能抽象为不同的对象。

一个角色刻画了一个对象所能提供的功能。从SID的业务视图角度看,这种刻画指的是属性和关系;从SID系统视图看,这种刻画扩展为方法、约束和行为。

角色模式的好处是:

1、易于分别定义实体本身的行为与实体的功能而互不影响;

2、实体角色的改变不需要改变实体本身。

回到一开始讲到的例子,如果采用角色模式,我们不需要定义不不同的子类,而是为设备的不同功能创建不同的角色,这样就解决了同样的功能重复出现在不同设备上的混乱情况,例如可以将路由功能与路由器、三层交换机进行关联。如下图所示:

由于通信网技术的不断发展,继承方式不能很好地驾驭这些变化。如果将关键功能抽象为角色,则可以为现在和将来出现的设备统一建模,因此将设备角色(DeviceRole)定义为不同于设备(Device)的实体是一种可扩展的方式。这样只需要为设备角色(DeviceRole)创建不同的子类以表示不同的功能,通过组合相关的设备角色形成某个设备的功能,从而避免为设备(Device)创建子类。

角色模式的应用:资源配置

举一个MPLS VPN的例子,不管VPN的拓扑有多复杂,其设备基本上由3种角色的路由器构成:

1、    CE

2、    PE

3、    P

一个基本的VPN拓扑如下图所示:

上图显示了2条VPN,红色VPN通过骨干网连接了站点1和站点3,绿色VPN通过骨干网连接了站点2和站点4。这2条VPN共享了相同的网络。角色的概念可以用来标准化CE与PE的连接和转发配置。例如,为CE路由器定义一组策略,用于控制其如何连接不同类型的PE路由器。这些策略可以抽象为不同的角色,独立于任何特定的设备,从而能够减少冗余并实现重用。另外,运营商骨干网的核心由扮演P角色的路由器构成,由于这4个P路由器功能相同,其中1个路由器的配置模板可以用来配置其它3个P路由器。PE和CE的配置可以采用相同的方式。

TMF SID中的角色模式的更多相关文章

  1. 基于TMF SID的高可扩展性数据模型

    基于TMF SID的高可扩展性数据模型 前言 此文根据TMF SID规范撰写,欢迎大家提出建议和意见. TMF文档版权信息 Copyright © TeleManagement Forum 2013. ...

  2. TMF SID性能相关实体介绍

    TMF SID性能相关实体介绍 Copyright © TeleManagement Forum 2013. All Rights Reserved. This document and transl ...

  3. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  4. angular中的MVVM模式

    在开始介绍angular原理之前,我们有必要先了解下mvvm模式在angular中运用.虽然在angular社区一直将angular统称为前端MVC框架,同时angular团队也称它为MVW(What ...

  5. JSP中使用的模式——JSP+Servlet+JavaBean

    上一篇博文写到模式一:JSP+JavaBean 链接地址:http://wxmimperio.coding.io/?p=155 JSP中两种模式的总结 链接地址:http://wxmimperio.c ...

  6. Web前端开发中的MCRV模式(转)

    作者: izujian  来源: baiduux 摘要:针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为 基础,结 ...

  7. 002-创建型-04-建造者模式(Builder)、JDK1.7源码中的建造者模式、Spring中的建造者模式

    一.概述 建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象 ...

  8. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  9. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

随机推荐

  1. WebSocket实现Web聊天室

    一.客户端: JS代码如下: /* * 这部分js将websocket封装起来 */ var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSock ...

  2. 遇到“拒绝了对对象的 EXECUTE 权限”和“无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限”的问题

    在将数据库从sqlserver2000迁移到2005后,原有的用户名TDS在执行存储过程是报错:“拒绝了对对象的 EXECUTE 权限”. 如网上所说,在使用的数据库的属性页->权限中给TDS添 ...

  3. 自顶向下归并排序(Merge Sort)

    一.自顶向下的归并排序思路: 1.先把数组分为两个部分. 2.分别对这两个部分进行排序. 3.排序完之后,将这两个数组归并为一个有序的数组. 重复1-3步骤,直到数组的大小为1,则直接返回. 这个思路 ...

  4. Victor/ArrayList/LinkedList/Stack/CopyOnWriteArrayList 区别

    Victor:采用数组的方式存储数据,与ArrayList相同,线程安全.性能比ArrayList差 ArrayList:采用数据的方式存储数据,线程不安全.ArrayList使用数组来存储数据,使用 ...

  5. for循环中删除map中的元素,valgrind检测提示error:Invalid read of size 8

    #include <iostream> #include <map> using namespace std; class A { public: typedef std::m ...

  6. Ueditor基础使用

    感谢大家对我这个菜鸟的帮助,这是我第一次用.NET做网站.在这里向大家推荐个百度免费的文本编辑器Ueditor,是.NET版的,在http://ueditor.baidu.com/website/in ...

  7. zTree获取(子)节点

    var ids=[]; ids=getChildren(ids, treeNode);//TreeNode是选中节点,ids是子节点id数组,格式:123,223,4,55 1.获取直接子节点的id ...

  8. 分享知识-快乐自己:idea的断点调试

    1:Step Over ,进入下一步,如果是方法,那就直接跳过(F8) 2:Step Into,进入下一步,如果是方法,就进入方法内部,但是不会进入jdk封装的方法.(F7) 3:Force Step ...

  9. QToolBox

    QToolBox类似与以前qq好友分组的那种控件.每个分组是一个Item. 一.添加分组: 其中每个分组是通过一下函数添加的: int addItem(QWidget * w, const QIcon ...

  10. django学习笔记(一)视图和url配置

    1.开始一个项目: 进入创建的目录,然后: django-admin startproject myblog 2.启动开发服务器: python manage.py runserver 注:默认是80 ...