`
mewleo
  • 浏览: 76545 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

实现DDD装备模型

阅读更多

经过最近潜心研究,基于上次说过的草根想法 对象,你喜欢极品装备吗? 实现了一个简单的装备模式。

然后写了一个弱弱的实现框架,目前肯定无法投入到开发中使用,只是想证明这条路可以走走看~~~

框架也没名字,临时叫OMM(简单好记),下面让各位看一下使用方法和HelloWorld示例。

 


 

 首先,需要一个POJO,这次用User,他有中英文两种名字。在中国叫他的中文名,在外国叫英文名(废话)。

注意:需要jdk5.0+

java 代码
  1. package ddd.domain;   
  2. /**  
  3.  * User模型  
  4.  * 属性:{  
  5.  *    英文名  
  6.  *    中文名  
  7.  * }  
  8.  * @author mewleo  
  9.  *  
  10.  */  
  11.   
  12. public class User {   
  13.     private String name_ch;   
  14.     private String name_en;   
  15.     public String getName_ch() {   
  16.         return name_ch;   
  17.     }   
  18.   
  19.     public void setName_ch(String name_ch) {   
  20.         this.name_ch = name_ch;   
  21.     }   
  22.   
  23.     public String getName_en() {   
  24.         return name_en;   
  25.     }   
  26.   
  27.     public void setName_en(String name_en) {   
  28.         this.name_en = name_en;   
  29.     }   
  30. }   

 

然后,我们要制作两件"HelloWorld"要用的装备,让User可以say hello,一个说英语,一个说汉语的。

java 代码
  1. package ddd.equip;   
  2. import com.mewleo.oo.ddd.Equip;   
  3. import com.mewleo.oo.ddd.Return;   
  4.   
  5. import ddd.domain.User;   
  6. /**  
  7.  * User模型 英语hello  
  8.  * 输入参数 String name  
  9.  * 输出 Hello <name></name>,I'm  <pojo.name></pojo.name>  
  10.  * @author mewleo  
  11.  *  
  12.  */  
  13. public class User_EnglishHello_Equip implements Equip<user></user><user></user>{   
  14.     User u;   
  15.     public void execute(Return caller, Object parm) {   
  16.         String name=(String)parm;   
  17.         System.out.println("Hello "+(name==null?"":name)+"! I'm "+u.getName_en());   
  18.     }   
  19.   
  20.     public void init(User pojo) {   
  21.         u=pojo;   
  22.     }   
  23.   
  24. }   
java 代码
  1. package ddd.equip;   
  2. import com.mewleo.oo.ddd.Equip;   
  3. import com.mewleo.oo.ddd.Return;   
  4.   
  5. import ddd.domain.User;   
  6. /**  
  7.  * User模型 汉语hello  
  8.  * 输入参数 String name  
  9.  * 输出 你好 <name></name>,我是  <pojo.name></pojo.name> !  
  10.  * @author mewleo  
  11.  *  
  12.  */  
  13. public class User_ChineseHello_Equip implements Equip<user></user><user></user>{   
  14.     User u;   
  15.     public void execute(Return caller, Object parm) {   
  16.         String name=(String)parm;   
  17.         System.out.println("你好 "+(name==null?"":name)+",我是"+u.getName_ch()+"!");   
  18.     }   
  19.   
  20.     public void init(User pojo) {   
  21.         u=pojo;   
  22.     }   
  23.   
  24. }   

大家可以发现,在接口部分使用了jdk5的泛型类,实现Equip接口的两个方法。Equip接口的装备只有一种动作Method!

然后,我们再来制作一件极品装备(一般来说,在游戏里普通装备是白色的名字,只有一种属性功能,而极品装备一般是
彩色名字,并且拥有多种属性功能,口水。。)

java 代码
  1. package ddd.equip;   
  2. import com.mewleo.oo.ddd.JPequip;   
  3. import com.mewleo.oo.ddd.PackObject;   
  4.   
  5. import ddd.domain.User;   
  6. /**  
  7.  * User极品装备  
  8.  * 动作{  
  9.  *    默认动作 defaultMethod  
  10.  * }  
  11.  * @author mewleo  
  12.  *  
  13.  */  
  14. public class User_JPEquip extends JPequip {   
  15.     User u;   
  16.     @Override  
  17.     public void init(User pojo) {   
  18.         u = pojo;   
  19.     }   
  20.     @Override  
  21.     public User_JPEquip setUp() {   
  22.         return this;   
  23.     }   
  24.     @Override  
  25.     public Object defaultMethod(String actionName, Object parm) {   
  26.         System.out.println("[BETA]Making In China @By MewLeo ...");   
  27.         return null;   
  28.     }   
  29.        
  30.     //自定义User类info方法,区分大小写   
  31.     @SuppressWarnings("unchecked")   
  32.     public Object info(Object parm){   
  33.         PackObject<user></user> user=(PackObject<user></user>)parm;   
  34.          return "User ["+user.getPojo().getName_en()+"] equiped ["+user.getSuit().getSuitName()+"]";   
  35.     }   
  36.   
  37. }   

极品装备比较特殊,所以需要继承于一个 极品类,这样才能属性极品装备家族,里面有两个方法,一个是默认方法,一个是
显示对象装备信息的方法。当找不到极品装备中的某个方法时会调用默认方法。

到现在,我们的User装备已经准备完成了,下面要定义套装了。套装是为了适合不用的场景与环境搭配的。
这里我们假设两个场景,一个是User在中国,另一个是User在英国。

java 代码
  1. package ddd.suit;   
  2. import com.mewleo.oo.ddd.EquipUp;   
  3. import com.mewleo.oo.ddd.PackObject;   
  4. import com.mewleo.oo.ddd.Suit;   
  5.   
  6. import ddd.domain.User;   
  7. import ddd.equip.User_ChineseHello_Equip;   
  8. import ddd.equip.User_JPEquip;   
  9. /**  
  10.  * User模型套装  
  11.  * 名称:中国  
  12.  * @author mewleo  
  13.  *  
  14.  */  
  15. public class User_China_Suit implements EquipUp<user></user> {   
  16.     //  极品装备↓   
  17.     User_JPEquip jpuser=new User_JPEquip();   
  18.     public Suit<user></user> getSuit(PackObject<user></user> po) {   
  19.         Suit<user></user> s=new Suit<user></user>(po,"中国");   
  20.         s.setEquip("hello"new User_ChineseHello_Equip());   
  21.         s.setEquip("info", jpuser);   
  22.         s.setEquip("noaction", jpuser);   
  23.         return s;   
  24.     }   
  25. }   
java 代码
  1. package ddd.suit;   
  2. import com.mewleo.oo.ddd.EquipUp;   
  3. import com.mewleo.oo.ddd.PackObject;   
  4. import com.mewleo.oo.ddd.Suit;   
  5.   
  6. import ddd.domain.User;   
  7. import ddd.equip.User_EnglishHello_Equip;   
  8. import ddd.equip.User_JPEquip;   
  9. /**  
  10.  * User模型套装  
  11.  * 名称:english  
  12.  * @author mewleo  
  13.  *  
  14.  */  
  15. public class User_English_Suit implements EquipUp<user></user> {   
  16.     //极品装备↓   
  17.     User_JPEquip jpuser=new User_JPEquip();   
  18.     public Suit<user></user> getSuit(PackObject<user></user> po) {   
  19.         Suit<user></user> s=new Suit<user></user>(po,"english");   
  20.         s.setEquip("hello"new User_EnglishHello_Equip());   
  21.         s.setEquip("info", jpuser);   
  22.         s.setEquip("noaction", jpuser);   
  23.         return s;   
  24.     }   
  25. }   

套装中的装备绑定的名称,就是对象最终获得的动作action方法。

好了准备完毕了,看一看结构,是这样的树:
DDD
   |—domain
   |          |—POJO
   |—equip
   |          |—装备
   |—suit
   |          |—套装

这里没用di容器,因为还有好多地方没有做优化,尤其是在众多装备的管理方面,将来对象的原子动作如果很多,那这里就会
相当难管理,这个问题要借助guice帮助,实现中···

好了,下面看一下如何让他们工作,并让User say hello!

java 代码
  1. package ddd;   
  2. import com.mewleo.oo.ddd.PojoPack;   
  3.   
  4. import ddd.domain.User;   
  5. import ddd.suit.User_China_Suit;   
  6. import ddd.suit.User_English_Suit;   
  7. /**  
  8.  * 测试 装备对象  
  9.  * @author mewleo  
  10.  *  
  11.  */  
  12. public class UserMain {   
  13.     public static void main(String args[]) throws Exception{   
  14.         //新User Pojo   
  15.         User user=new User();   
  16.         user.setName_ch("康夫");   
  17.         user.setName_en("Nobita");   
  18.            
  19.         //两个包装对象,穿衣服,上装备   
  20.         PojoPack<user></user> chuser=new PojoPack<user></user>(user,new User_China_Suit());   
  21.         PojoPack<user></user> enuser=new PojoPack<user></user>(user,new User_English_Suit());   
  22.         System.out.println("chuser info:"+chuser.executeAction("info",chuser));   
  23.         System.out.println("enuser info:"+enuser.executeAction("info",enuser));   
  24.         // HelloWorld   
  25.         System.out.println("\n测试:");   
  26.         chuser.executeAction("hello","MewLeo");   
  27.         enuser.executeAction("hello","MewLeo");   
  28.         //修改user属性,执行hello   
  29.         System.out.println("\n修改再测试:");   
  30.         user.setName_ch("爪哇");   
  31.         user.setName_en("Java");   
  32.         chuser.executeAction("hello","MewLeo");   
  33.         enuser.executeAction("hello","MewLeo");   
  34.         //调用极品装备中不存在的方法...   
  35.         System.out.println("\n未定义方法:");   
  36.         chuser.executeAction("noaction");   
  37.     }   
  38. }  

我们来看看输出结果:

chuser info:User [Nobita] equiped [中国]
enuser info:User [Nobita] equiped [english]

测试:
你好 MewLeo,我是康夫!
Hello MewLeo! I'm Nobita

修改再测试:
你好 MewLeo,我是爪哇!
Hello MewLeo! I'm Java

未定义方法:
[BETA]Making In China @By MewLeo ...

这样使用对象,其实是很大程度的改变了原有的设计思想以及开发方法,把问题往下抛,让对象自管理,至少他能管好自己。
上面的源码和omm.jar在附件中,框架的源码请到我的论坛文件中下载http://groups.google.com/group/mewleo

希望大侠门多指教,像上次那贴被评良好但没几个回复的。。。。我需要大家的帮助才能成功的完成这一想法

还是,先谢谢了,看完挺累的~~休息眼睛。

  • usertest.rar (13.5 KB)
  • 描述: 里面包含omm.jar与ddd包和所有上述java文件
  • 下载次数: 69
分享到:
评论
5 楼 mewleo 2007-05-21  
hunter_z 写道
你的思路我明白了,一套框架根据不同的需求进行切换
恩,我的装备模式就是这个意思!
至于这个框架,周末已经改了两次,发现他应用的场景
还很多呢,这里只实现了PojoPack类,对Domain封装。
后来发现我的ObjectPack接口可以扩展service或者静态
方法。
用Db4o的时候有位朋友写了一个泛型通用的DAO模板,
很像那个daozero,然后我在它的基础上进行包装,实现
扩展的模糊条件查询NQ,很爽。
然后继续思考,发现在Action或者在jsp中可以直接使用
包装对象,免去Service接口了,为通用的系统服务或者
静态方法做一个硬性装备,在ObjectPack实例话的时候
就装载(宠物?坐骑?家族召唤兽?地图兵器?),这样
一个最外层的ObjectPack对象就可以完成所有业务逻辑了
继续思考中.........
4 楼 mewleo 2007-05-20  
呵呵,不是什么大词啊,喜欢玩网络游戏的都知道,装备很重要
也是平时听的最多的词汇了,用这个词是为了其他人容易理解。

我经验不足,没有做过很多通用系统~你说的这个跟我现在相的好像
是一样的,但是这不是我全部的思路。我表达的思想是在企业应用中
在特定的场景,使用切面管理所用需要的plugin,当场景切换时
也能随时换成适合场景的一套plugin,其实我用装备的意思就是主
要表达“套装”的概念,上一帖子说过,其实主体思路是对象包装。

不知道这样说diz大侠能体谅我用词的原因了吧,不是我想用什么大词
相信您能理解。其实现在在管理装备与套装的部分还没有完善,希望
大侠不吝赐教,小弟感激不尽。
3 楼 diz 2007-05-20  
其实这种模式也不算什么了!搞不懂为什么总有喜欢给一些东西取那些大词,我刚看这个帖子的时候都吓了一跳!什么装备模型阿!进来一看原来是这个哦!

其实很多通用系统中都习惯采用这种方式!把组件当成装备!用过plugin的方式挂载在Adaptor上!
2 楼 mewleo 2007-05-20  
粘贴代码的标签总是把<User>过滤掉,好多使用泛型的地方都
被pass掉了,我把代码复制到google文件了
可以到这看http://docs.google.com/View?docid=dcpd9tvz_35hffznj
或者下载附件看代码。
1 楼 mewleo 2007-05-19  
总的来说,个人感觉这个模型与贫血、充血不是一个系列。
我不主张大家都用这种模式,这只是一个雏形~~~~~
请大家不要争论有关各种模型的选择问题!
大家按喜好随意选择,随心所欲。

相关推荐

    CodingKata-EverCraft

    在EverCraft游戏中,域模型可能包括角色、装备、技能、怪物、地图、任务等多种组件。每个组件都有其特定的属性和行为,这些都需要在C#类中进行建模。 在C#中,我们可以使用类来表示实体,如`Player`、`Item`、`...

    事件风暴实例_一个实例说明事件风暴的实践

    通过事件风暴,我们可以构建出清晰的业务模型,使得开发团队能够更好地理解和实现复杂的业务流程,提高软件系统的可维护性和扩展性。在实际应用中,事件风暴不仅用于系统设计的初期阶段,也可以在项目进行中作为迭代...

    kernel-devel-4.18.0-553.45.1.el8-10.x86-64.rpm

    Rocky Linux 8.10内核包

    Simulink中三阶单环多位量化Σ-Δ调制器的设计与实现-音频带ADC的应用(复现论文或解答问题,含详细可运行代码及解释)

    内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。

    计算机课后习题.docx### 【计算机科学】研究生入学考试计算机组成原理专项题库设计:考研复习资源集成与优化

    内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名校考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名校考研真题精选多所知名高校的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众多名校列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名校考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平。

    __UNI__DB9970A__20250328141034.apk.1

    __UNI__DB9970A__20250328141034.apk.1

    minio-rsc-Rust资源

    rust for minio

    4-4-台区智能融合终端功能模块型式规范(试行).pdf

    国网台区终端最新规范

    《基于YOLOv8的化工管道焊缝缺陷检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    python源码-1个机器学习相关资源

    一个简单的机器学习代码示例,使用的是经典的鸢尾花(Iris)数据集,通过 Scikit-learn 库实现了一个简单的分类模型。这个代码可以帮助你入门机器学习中的分类任务。

    pyqt离线包,pyqt-tools离线包

    pyqt离线包,pyqt-tools离线包

    《基于YOLOv8的船舶机舱灭火系统状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    SQL常用日期和时间函数整理及使用示例

    SQL常用日期和时间函数整理及在sqlserver测试示例 主要包括 1.查询当前日期GETDATE 2.日期时间加减函数DATEADD 3 返回两个日期中指定的日期部分之间的差值DATEDIFF 4.日期格式转换CONVERT(VARCHAR(10),GETDATE(),120) 5.返回指定日期的年份数值 6.返回指定日期的月份数值 7.返回指定日期的天数数值

    GSDML-V2.3-Turck-BL20-E-GW-EN-20160524-010300.xml

    GSDML-V2.3-Turck-BL20_E_GW_EN-20160524-010300.xml

    T_CPCIF 0225-2022 多聚甲醛.docx

    T_CPCIF 0225-2022 多聚甲醛.docx

    《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计

    蚕豆脱壳机设计.zip

    蚕豆脱壳机设计.zip

    附件2-2:台区智能融合终端入网专业检测单位授权委托书.docx

    台区终端电科院送检文档

    Y6一39一No23.6D离心通风机 CAD().zip

    Y6一39一No23.6D离心通风机 CAD().zip

    django自建博客app

    django自建博客app

Global site tag (gtag.js) - Google Analytics