`
y806839048
  • 浏览: 1127088 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

架构设计中领域模型设计思路

阅读更多

架构设计中领域模型设计思路:

 

 

最终发送的是报文头+业务头+具体业务

 

 

抽象出的基类(大多数类共有的字段属性):报文头部分

 

1,实体分层嵌套

大层实体类也应设计有tostring双向方法

还有用反射机制做的操作自身属性(根据报文操作对应实体属性)

继承的方式拓展,处理方法也需公用的话,在子类父类的抽象方法,父类用反射操作子,虽然写在子类方便不必反射,但是不可公用

在联调接口的时候:

    1,对方传来的字符串有固定的json等模式用工具转化为实体

    2,不用类转化工具可以直接用反射的机制操作(这种反射机制在根据传过来的字符串调用不同的服务类的方法很有用)

    3,按报文的固定位置依次遍历给相应的对象属性赋值

抽象方法

 

2,小的实体类

属性+tostring()双向方法

 

 

 

具体业务类:报文体部分

1,继承抽象类

2,通过复写抽象方法进一步个性化处理

3,自己的业务属性

 

小的实体类需要再细分的时候,中间的实体不必集成抽象方法(此时其仍为抽象类),最终类中覆盖即可

 

在应有的时候传入父类即可(类似于模式(在服务层之间套用服务应用))(在服务层用实体实体传值用(接口中的传值类型))

 

实体多态的使用:

public interface PacketProcesser<P extends PaPacket,T extends Answer> {

 

public  T execute(P packet);

 

}

 

 

@Service

public class XxProcesser implements PacketProcesser<BP1303,RspBP1303> {

 

@Override

public RspBP1303 execute(BP1303 packet) {

 

服务多态的使用:

参考设计模式

 

 

 

反射机制也是一种转化返回信息为实体的方式,在需要根据返回字段调用对应方法时更优势

 

 

======================================================================================

 

 

根据报文位置依次给对象属性赋值示例:

 

 

this是调用此方法当前的对象,反射是用的字节码对点,this.getClass()

 

PacketHeader:业务头也类似BusinessHeader

 

Assert.isTrue(src.length >= PacketHeader.HEADERLEN, "报文头长度必须大于" + PacketHeader.HEADERLEN);

Assert.notNull(this.packetHeader);

 

将长的报文一段一段解析出(设值到实体属性)

int srcPos = 0;

// 1 报文类别

char[] dest = new char[4];

System.arraycopy(src, srcPos, dest, 0, dest.length);

this.setPacketType(new String(dest).trim());

srcPos += 4;

 

 

一段一段的拼接出长的报文(从实体属性拼出)

int dstBegin = 0;

char[] dst = new char[222];

 

for (int i = 0; i < dst.length; i++) {

dst[i] = ' ';

}

 

// 1 报文类别

packetType.getChars(0, 4, dst, dstBegin);

 

最终发送的是报文头+业务头+具体业务

 

这两个相当于PacketHeader的tostring的正反(在PacketHeader中)

 

 

 

使用反射机制根据报文调用相应方法示例:

 

ProcesserInfo info = processer.get(tranFunc);

 

Assert.notNull(info);

 

 

Object processer = this.beanFactory.getBean(info.getBeanName());

 

 

Class<PacketProcesser<PaPacket, Answer>> cls = (Class<PacketProcesser<PaPacket, Answer>>) processer.getClass();

 

PacketProcesser<PaPacket, Answer> proc = cls.cast(processer);

 

Type type = info.getBeanClass().getGenericSuperclass();

 

 

ParameterizedType pt = (ParameterizedType) type;

Type[] args = pt.getActualTypeArguments();

 

Class<PaPacket> clazz = (Class<PaPacket>) Class.forName(args[0].getTypeName());

 

PaPacket packet = clazz.newInstance();

packet.analyze(packetStr);

Answer answer = proc.execute(packet);

 

//验证方法返回的结果是否正确

ValidatorResult<Answer> result = packetValidator.validator(answer);

 

 

 

==============================================================================

实体层级设置示例:

往往涉及父类方法操作子类

1,父类提供抽象方法让子类传递需要操作的属性

2,父类用反射机制操作(子类操作父类用super即可 )

 继承的方式拓展,处理方法也需公用的话,在子类父类的抽象方法,父类用反射操作子,虽然写在子类方便不必反射,但是不可公用

PaPacket:  

 

  PacketHeader//有自己的string方法,转化为实体的方法

  BusinessHeader//有自己的string方法

  protected abstract String[] order();

  marshal//总的string方法

  analyze//总转化为实体的方法

 

里面的抽象方法order()是业务实体中需要加入转化的字段

 

marshal将所有有关实体转化为字符串:

 

getstring转化业务实体到string,getPacketHeader转化报文头实体到string,

 

 

 

 

 

 

public String getString() {

StringBuilder sb = new StringBuilder();

try {

for (String fName : this.order()) {

Object obj = getValue(fName);

if (obj == null) {

sb.append("");

}

if (obj instanceof String) {

sb.append((String) obj);

}

if (obj instanceof Integer) {

sb.append(((Integer) obj).intValue());

}

if (obj instanceof Long) {

sb.append(((Long) obj).intValue());

}

if (obj instanceof Double) {

sb.append(df.format((Double) obj));

}

sb.append("&");

}

 

} catch (NoSuchFieldException | SecurityException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

 

e.printStackTrace();

}

sb.deleteCharAt(sb.length() - 1);

return sb.toString();

}

private Object getValue(String fName) throws NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

 

fName = fName.substring(0, 1).toUpperCase() + fName.substring(1);

Method method = this.getClass().getMethod("get" + fName);

Assert.notNull(method);

 

return method.invoke(this);

 

}

 

也就是说父类需要操作子类用反射的原理做,不同类之间的(不是父子关系用获取实例(new)即可)又是根据传入的值动态变化调用(包括方法和属性)的用反射

 

analyze将整个报文转化为对象

 

 

 

业务类继承PaPacket

 

public abstract class InMoney extends PaPacket {

 

public class InMoneyBP1310 extends InMoney{

protected String[] order() {

String[]  args={"supAcctId","custAcctId","tranAmount","tnAcctId","inAcctIdName","ccyCode","acctDate","reserve"};

 return args;

}

 

 

 

}

 

覆盖order()方法加入需要转化的字段

 

小的实体类需要再细分的时候,中间的实体不必集成抽象方法(此时其仍为抽象类),最终类中覆盖即可

 

 

 

 

层级类的使用示例:

传入具体的,使用的时候用泛型,父类作为接收值,对于有用接口用到这些类,需要公用时也是用泛型或父类

 

 

 

结合抽象实例,方法抽象思维:

公用方法的抽象类别,

1,处理逻辑一样(接收参数的用父类泛型)

2,同类功能方法(接口参数的用父类泛型

3,模式

 

 

 

1,常规方法:

 

RspBP1020 rsp = (RspBP1020) paTemplate.execute(bp1020, RspBP1020.class);

 

 

 

 

 

 

 

 

public class PaTemplate {

 

@Autowired

private RestTemplate restTemplate;

 

@Autowired

private PacketValidator packetValidator;

 

@Value("${pa.url}")

private String paUrl ;

 

 

public <T> T execute(PaPacket packet,Class<T> responseType){

 

 

//验证业务报问题是否符合规范

ValidatorResult<PaPacket> result = packetValidator.validator(packet);

Assert.isTrue(result.isValid(),result.getMessage());

 

 

HttpHeaders tempHeaders = new HttpHeaders();

tempHeaders.add("Content-type", "application/json");

HttpEntity<PaPacket> httpEntity = new HttpEntity<PaPacket>(packet,tempHeaders);

 

T response = restTemplate.postForObject(paUrl, httpEntity, responseType);

 

 

return response;

}

 

 

}

 

 

 

 

 

 

2,通用接口:

 

 

public interface PacketProcesser<P extends PaPacket,T extends Answer> {

 

public  T execute(P packet);

 

}

 

 

@Service

public class XxProcesser implements PacketProcesser<BP1303,RspBP1303> {

 

@Override

public RspBP1303 execute(BP1303 packet) {

 

 

 

 

3,使用模式

 

 

 

 

分享到:
评论

相关推荐

    架构设计一些思路

    在架构设计中,业务层通常会按照领域模型进行划分,每个服务专注于处理特定的业务操作。这里的"Impl"后缀表明了这是一种采用Service层设计模式的方式,将接口(BankCardUpdateService)与实现分离,增加了代码的可...

    实现领域驱动设计-DDD架构设计思路-弗农著【高清版】

    下面我从领域、问题域、领域模型、设计、驱动这几个词语的含义和联系的角度去阐述DDD是如何融入到我们平时的软件开发初期阶段的。要理解什么是领域驱动设计,首先要理解什么是领域,什么是设计,还有驱动是什么意思...

    控制算法模型架构设计的最佳实践

    清晰的文档能帮助团队成员理解架构的设计思路和实现细节,而版本管理工具(如Git)则可以追踪修改历史,便于协同开发和问题追溯。 总之,"控制算法模型架构设计的最佳实践"涵盖了从需求分析到架构实施的全过程,...

    企业级业务架构设计方法论9.pdf

    该方法论的设计思路是从业务架构的顶层设计开始,通过业务架构的设计,实现企业的整体性,提高效率,降低成本,提高企业的竞争力。 企业级业务架构设计方法论的核心思想是战略业务企业级业务架构IT实现解析解构传导...

    浅谈12306核心模型设计思路和架构设计

    另外一个让我写这篇文章的原因,是我发现也许是否是因为目前12306的核心领域模型设计的不够好,导致用户购票时要处理的业务逻辑异常复杂,维护数据一致性的难度也几百倍的上升,同时面对高并发的

    寿险行业数据治理规划架构设计方案.pptx

    数据架构规划的设计思路包括系统需求分析、业务特征分析、数据分类、业务模型设计、数据模型设计等。 数据架构规划的重要组成部分是数据源、数据的准备、存储、加工、交换。数据源包括保单管理、新契约、保全、续期...

    2011年下半年 系统架构设计师 试题及答案详解.rar

    《系统架构设计师试题及答案详解》是一份针对2011年下半年系统架构设计师考试的重要...学习过程中,考生应注重理论与实践的结合,不断深化对架构设计的理解,以期在实际工作中能够设计出高效、稳定、可扩展的系统架构。

    软考系统架构设计师资料

    在信息技术领域,系统架构设计师是一个至关重要的角色,他们负责设计、规划和实施复杂的计算机系统,确保系统的高效、稳定和可扩展性。备考软考系统架构设计师,需要深入理解相关知识体系,涵盖操作系统、数据库、...

    2009-2018系统架构设计师.rar

    81篇辅导论文范文为考生提供了丰富的写作素材和参考,可以学习不同的架构设计思路、方法和案例。通过分析这些范文,考生能提升自己在架构设计中的逻辑思维能力,学会如何清晰、准确地表达设计方案,并能更好地掌握...

    灯塔工厂架构设计思路qy.pptx

    根据提供的文件信息,我们可以深入探讨灯塔工厂的概念、其架构设计思路、以及灯塔工厂的技术架构设计等内容。 ### 灯塔工厂概念及内涵 灯塔工厂是指在智能制造领域达到领先水平的企业工厂,它们通常拥有高度自动化...

    2018年下半年系统架构设计师考试真题.rar

    考生需要展示出深入的理解、独立思考和清晰的表达能力,同时要能够结合实际工作经验,阐述自己的观点和设计思路。 **学习资源**:提供的压缩包文件包含三份资料,分别是“2018年下半年系统架构设计师考试论文真题...

    基于TOGAF的领域知识模型设计.docx

    《基于TOGAF的领域知识模型设计》一文深入探讨了在这一背景下,如何通过采用TOGAF(The Open Group Architecture Framework,开放组体系架构框架)的方法论来进行信息化建设项目的领域知识模型设计。文章通过梳理...

    软件架构设计的方法论—分而治之与隔离关注面.pdf

    软件表述不仅限于代码,还包括模型、图示和文档,这些都是表达设计思路的重要工具。 #### 模块化与分而治之 “分而治之”是软件设计的核心原则之一,强调将复杂系统分解为更小、更可管理的模块。每个模块负责系统...

    2009-2018系统架构设计师真题及解析.zip

    《系统架构设计师》是全国计算机技术与软件专业技术资格(水平)考试(简称软考)中的高级资格证书之一,旨在评估并认证候选人在信息技术领域,特别是系统架构设计方面的专业能力。这个压缩包“2009-2018系统架构...

    银行核心系统之清算体系演变及基础架构设计.pdf

    本文主要描述了银行核心系统之清算体系演变及基础架构设计,分析了银行内部清算体系设计,有利于快速建立起金融服务体系思路。 一、我国支付清算系统的演变过程 在中国,支付清算系统的演变可以追溯到清王朝康乾...

    xx系统架构模型分享版v0.1

    - **国内/国际SOA接口**:详细介绍了国内和国际业务中的服务导向架构(SOA)接口设计。 - **国内/国际OpenApi**:描述了国内和国际业务中的开放API接口设计,以支持外部系统集成。 #### 九、领域模型 - **领域词汇**...

    巧解.net设计思路

    在.NET开发领域,设计思路是构建高效、可扩展和易于维护软件系统的关键。"巧解.NET设计思路"这个主题旨在帮助初学者打破思维僵局,激发创新思维,从而提升编程能力。以下是一些核心的设计思路及其详细解释: 1. **...

Global site tag (gtag.js) - Google Analytics