1. 两个基本扩展点:
public boolean expand(PatternParameterValue value) 在参数被绑定时触发,完成绑定参数的动作,同时可以观察到该方法返回值为boolean类型,但是不要以为返回false该动作不会发生,即无论扩展后该方法返回何值,bind事件都会被触发。若想改变这种状况,则必须进行验证,验证方法后面会提到。下面代码为在Service内部类扩展该方法的代码:
public boolean expand(PatternParameterValue value) {
Object obj = value.getValue();
if( obj instanceof Classifier ) {
Classifier classifier = (Classifier) obj;
// instance — instance of the pattern in the model which
gives values specified for this pattern.
com.ibm.xtools.patterns.framework.AbstractPatternInstance patternInstance =
value.getOwningInstance();
CachePatternImplementation impl;
impl = (CachePatternImplementation) instanceToImplMap.get(patternInstance);
if (impl == null) {
impl = new CachePatternImplementation (patternInstance);
instanceToImplMap.put(patternInstance, impl);
}
impl.expandService(classifier);
}
return true;
}
该段代码完成在绑定Service参数时,根据绑定的类生成相应的UML2 元素,其中主要的实现在CachePatternImplementation类中完成,以减少项目主类中的代码数量。
public boolean expand(PatternParameterValue.Removed value) 该方法在解除参数绑定时所触发,只要解除动作发生了,那么该方法将被执行。下面代码仍为在Service内部类扩展该方法的代码:比如,我们以在该例中的Service的expand方法编程,我们在该例子中为该Pattern的Service方法添加代码如下:
public boolean expand(PatternParameterValue.Removed value) {
Object obj = value.getValue();
if( obj instanceof Classifier ) {
Classifier classifier = (Classifier) obj;
// instance — instance of the pattern in the model which gives
values specified for this pattern.
com.ibm.xtools.patterns.framework.AbstractPatternInstance patternInstance =
value.getOwningInstance();
CachePatternImplementation impl;
impl = (CachePatternImplementation) instanceToImplMap.get(patternInstance);
if (impl == null) {
impl = new CachePatternImplementation (patternInstance);
instanceToImplMap.put(patternInstance, impl);
}
impl.removeService(classifier);
}
return true;
}
2. 依赖关系扩展点:
生成的依赖关系扩展点有如下三个
public boolean update(PatternParameterValue value, PatternParameterValue dependencyValue)
public boolean update(PatternParameterValue.Maintained value, PatternParameterValue.Removed dependencyValue)
public boolean update(PatternParameterValue.Removed value, PatternParameterValue.Maintained dependencyValue)
我们在此例中只有getEntry参数建立了依赖关系,而至扩展了第二个方法,因为第二个方法是在getEntry所依赖的Service方法删除时调用,而getEntry所绑定的参数的提供这恰为Service的参数,所以在Service参数解除绑定时,对应的getEntry也应该解除绑定,代码如下所示:
public boolean update(PatternParameterValue.Maintained value,
PatternParameterValue.Removed dependencyValue){
Object obj = value.getValue();
if( obj instanceof Operation) {
Operation oper = (Operation) obj;
// instance — instance of the pattern in the model which gives values
specified for this pattern.
com.ibm.xtools.patterns.framework.AbstractPatternInstance patternInstance =
value.getOwningInstance();
CachePatternImplementation impl;
impl = (CachePatternImplementation) instanceToImplMap.get(patternInstance);
if (impl == null) {
impl = new CachePatternImplementation (patternInstance);
instanceToImplMap.put(patternInstance, impl);
}
impl.unbindOperation(oper);
}
return true;
}
这段代码利用CachePatternImplementation类中的方法解除了getEntry方法的参数绑定。
3. 验证扩展点:
在此例中我们注意到Service的参数应当为Interface或是Class,而我们在指定类型时只能将其指定为Classifier,而Classifer作为UML2种的一个类型,包含许多子类型,比如Component、UseCase等等,而将这些类型作为Service的参数是不允许的,所以我们必须使用验证扩展点来保证这一点。在此例中我们扩展的方法及代码如下所示是:
protected IStatus validToAddArgument(PatternParameterValue.Proposed proposed){
// Use to judge whether the parameter can be bound.
IStatus status = super.validToAddArgument(proposed);
if (status.isOK()){
Object obj = proposed.getValue();
if ((obj instanceof Class)||( obj instanceof Interface)) ;
else return Status.CANCEL_STATUS;
}
return status;
}
至此,基本Pattern Authoring 的工作就算完成了,下面进行调试。
步骤四:调试
调试是必须运行一个runtime_workbench,这里我们建议选择eclipse的JVM,并设置参数为-Xj9,这样可以支持"hotcode-replacement"方便我们减少我们在调试过程中启动runtime_workbench的次数。调试界面如下图所示:
1. 在Runtime_workbench中切换到Model perspective,并打开Pattern Explorer视图,如上图所示。
2. 可以看到我们刚刚创建的Cache Pattern已经在Tutorial Pattern组中,将其拖至建好的空的Model中,建立测试用的接口或类,绑定适当的参数,就可以借助RSA提供的强大功能进行调试了。
调试完成,也就完成了这个简单而又实用的Cache Pattern的开发工作。
结语
通过本文的介绍,我们可以看到,模式是一种抽象的软件解决方案,用来解决一个在特定场景中的连续的或反复出现的问题。开发设计过程中大量地使用模式有很多的优点,我们可以利用已有的模式来解决一些软件问题,从而节省了设计人员的时间。模式的用户并不需要知道如何去设计一个具体的模式,但是用户需要有好的模式文档,好的模式文档能帮助模式的用户定位、选择和应用不同的模式。用户需要了解这个模式是用来解决什么问题的,这个问题是如何被解决的以及应用这个模式的结果。模式的作者能够创造多种类型的与模式打包在一起的模式文档,在模式应用过程中,用户可以使用这些文档。
模式的可重用性还能够节省大量的设计开发时间。 可重用的特性增加了软件的可靠性和编码设计的连续性。一个模式可以在一个项目中、一个公司内部以至不同公司间共享。模式的局限性由模式的设计以及模式开发者的设计意图所决定。而RSA中的模式都由标准的Eclipse插件构成,我们可以通过将包含模式的插件打包成可重用的资产(Reusable Asset Specifications)并且在RAS资产库中注册和管理它们来实现最大程度的模式可重用性。通过由模式开发者提供的模式的关键字和描述的匹配,潜在的模式用户可以从RAS资产库里搜索和选择所需的模式。模式这种特殊的资产遵循RAS(Reusable Asset Specifications)所制定的标准, 通过遵循这些统一的规范,模式用户和模式开发者之间可以非常便利地交换模式。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
事件驱动框架和SOA在空军的应用
空军正在利用SOA来改善数据共享,并实时跟踪战机,美国空军机动司令部的Michael Marek解释了企业可从中学习的经验。
-
揭秘New Relic APM技术细节
New Relic应性能管理(APM)套件主要用于Web软件开发。它允许用户在面向服务的架构(SOA)上跟踪关键事务性能,并且支持代码级别的可见性来评估特定代码段和SQL语句对性能的影响
-
仅凭SOA和云无法解决业务数据管理风险问题
SOA和云可以是某些恼人问题高效的解决方案;这一点我们已经知道了。但是也要记住它们并不是所有事情的直接答案,特别是当你的问题是业务数据管理风险,而不是技术问题时。
-
如何避免云计算与SOA冲突