- 浏览: 1437055 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (409)
- Java (48)
- Spring (29)
- struts2 (17)
- hibernate (4)
- 设计模式 (24)
- jbpm (1)
- JavaScript (5)
- 统计报表 (7)
- ExtJS_3.0 (35)
- struts1 (1)
- 分析设计 (3)
- Flex3 (24)
- UML (2)
- 数据库 (18)
- PowerDesigner (2)
- 应用服务器 (3)
- WebService (5)
- ActiveMQ_5.3.2 (6)
- Java通信技术 (11)
- GWT (6)
- OSGi (15)
- android (11)
- liferay6.0.6 (13)
- jquery (13)
- Linux (3)
- java.util.concurrent (16)
- guava (9)
- 开发模式 (1)
- 大数据 (2)
- 互联网金融 (4)
- treegrid-3.0 (7)
- 分布式 (8)
- GO语言 (4)
- maven (1)
- 缓存技术 (6)
- 其他 (2)
- 前端页面 (1)
- heasy (1)
- spring cloud(F版) (21)
- springboot (12)
- springmvc (5)
- mybatis (3)
- dubbo (1)
- 物联网 (0)
最新评论
-
raymond.chen:
谢谢您的分享
使用Ngrok解决通过外网访问内网web应用 -
wangyudong:
速度有点慢,不过在也找到了一个开源的holer,配置一个key ...
使用Ngrok解决通过外网访问内网web应用 -
a1006458222:
...
Axis2的部署和应用 -
偷师来了:
不好意思 这样的博客我觉得就灭有必要分享出来了 命令大家都会看 ...
Consul框架介绍 -
lliiqiang:
怎么直接删除文件夹啊?固定的几个文件可以删除,不固定的呢?需要 ...
Flex AIR —— 文件读写
Spring AOP的应用:在处理业务短信之前,可以执行前置方法,在处理业务短信之后,可以执行后置方法。
策略模式的应用:不同的业务对应不同的短信格式,业务短信可以随时新增、删除,扩展性高。
模板方法模式的应用:业务短信的校验和最后处理定义成抽象方法,而且,要先通过校验后才能作最后的处理。
访问者模式的应用:每种校验规则都是对所属的短信处理器进行校验。
相关的源代码、类图、配置信息如下:
一、类图
二、类源代码
1、抽象类AbstractNoteProcessor源代码
public abstract class AbstractNoteProcessor { private String prefix; private long smsid; private String msisdn; private String content; //###### 此处省略成员变量的get方法 ##### /** * 此处应用了模板方法模式 * * @param prefix 短信前缀 * @param smsid 短信流水号 * @param msisdn 手机号码 * @param content 短信内容 */ public void process(String prefix, long smsid, String msisdn, String content){ this.prefix = prefix; this.smsid = smsid; this.msisdn = msisdn; this.content = content; boolean b = validate(); if(b){ proceed(); } } protected abstract boolean validate(); /** * 在该方法控制事务 */ protected abstract void proceed(); }
2、类DefaultNoteProcessor的源代码
public class DefaultNoteProcessor extends AbstractNoteProcessor { private List checkRules; public void setCheckRules(List checkRules) { this.checkRules = checkRules; } /** * 遍历执行每个校验规则,当一个校验规则返回false时,结束继续校验 * * 此处应用了访问者模式 */ protected boolean validate() { if(checkRules == null || checkRules.size() <= 0) return true; for(int i=0;i<checkRules.size();i++){ Rule rule = (Rule)checkRules.get(i); boolean b = rule.check(this); if(!b) return false; } return true; } protected void proceed() { } }
3、类CardSalesNoteProcessor的源代码
public class CardSalesNoteProcessor extends DefaultNoteProcessor { protected void proceed() { System.out.println("卡品批售业务短信已处理!"); } }
4、接口Rule的源代码
public interface Rule { public boolean check(AbstractNoteProcessor processor); }
5、类FormatRule的源代码
/** * 短信格式规则验证类 */ public class FormatRule implements Rule { public boolean check(AbstractNoteProcessor processor) { boolean pass = true; String[] arr1 = processor.getContent().split(","); //格式判断 if(arr1.length < 2 || arr1.length > 7){ pass = false; }else{ for(int i=0;i<arr1.length;i++){ String s = arr1[i]; if(i == 0){ if(s.split("#").length != 3){ pass = false; break; } }else{ if(s.split("#").length != 2){ pass = false; break; } } } } if(!pass){ System.out.println("短信格式有误,卡品申请短信的正确格式为:" + processor.getPrefix() + "帐号#密码,卡编号1#数量1,卡编号2#数量2,...(最多6组卡品)!"); } return pass; } }
6、类NoteManager的源代码
/** * 短信管理器类 */ public class NoteManager{ /** * 存放短信处理器列表 */ private Map processorMap; public void setProcessorMap(Map processorMap) { this.processorMap = processorMap; } /** * 根据短信前缀调用相应的处理器处理短信 * * 此处应用了策略模式 * * @param smsid 短信流水号 * @param msisdn 手机号码 * @param content 短信内容 */ private void doInProcessor(long smsid, String msisdn, String content){ boolean done = false; if(processorMap!=null && processorMap.keySet().size() > 0){ for(Iterator it=processorMap.keySet().iterator();it.hasNext();){ String prefix = (String)it.next(); AbstractNoteProcessor processor = (AbstractNoteProcessor)processorMap.get(prefix); if(content.startsWith(prefix)){ processor.process(prefix, smsid, msisdn, content); done = true; break; } } } if(!done){ System.out.println("短信格式不支持!"); } } public void run(){ List dataList = getTestData(); if(dataList==null || dataList.size()<=0) return; for(int i=0;i<dataList.size();i++){ Map map = (Map)dataList.get(i); long smsid = ((Long)map.get("smsid")).longValue(); String msisdn = (String)map.get("msisdn"); String content = (String)map.get("content"); doInProcessor(smsid, msisdn, content); } } /** * 获取测试数据的方法 */ private List getTestData(){ List dataList = new ArrayList(); Map map1 = new HashMap(); map1.put("smsid", new Long(1)); map1.put("msisdn", "13763387426"); map1.put("content", "91#3070301,123456,221#40,222#20"); dataList.add(map1); Map map2 = new HashMap(); map2.put("smsid", new Long(2)); map2.put("msisdn", "13763387427"); map2.put("content", "66#307030102#13826532222"); dataList.add(map2); Map map3 = new HashMap(); map3.put("smsid", new Long(3)); map3.put("msisdn", "13763387428"); map3.put("content", "88#13826532223#cl"); dataList.add(map3); return dataList; } }
7、前置通知类的源代码
public class NoteManagerBeforeAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] args, Object target)throws Throwable { System.out.println("在执行NoteManager的run方法之前,执行该方法!"); } }
8、后置通知类的源代码
public class NoteManagerAfterReturningAdvice implements AfterReturningAdvice { public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("在执行NoteManager的run方法之后,执行该方法!"); } }
三、Bean配置
<!-- 短信处理器 --> <!-- 卡品批售短信处理器 --> <bean id="cardSalesNoteFormatRule" class="com.jeyo.note.processor.cardsales.FormatRule"/> <bean id="cardSalesNoteProcessor" class="com.jeyo.note.processor.cardsales.CardSalesNoteProcessor"> <property name="checkRules"> <list> <ref bean="cardSalesNoteFormatRule"/> </list> </property> </bean> <!-- 号码激活短信处理器 --> <bean id="numActiveNoteProcessor" class="com.jeyo.note.processor.numactive.NumActiveNoteProcessor"/> <!-- 数据业务开通短信处理器 --> <bean id="operationOpenNoteProcessor" class="com.jeyo.note.processor.operation.OperationOpenNoteProcessor"/> <!-- 短信管理器目标对象 --> <bean id="noteManagerTarget" class="com.jeyo.note.NoteManager"> <property name="processorMap"> <map> <entry key="91#" value-ref="cardSalesNoteProcessor"/> <entry key="66#" value-ref="numActiveNoteProcessor"/> <entry key="88#" value-ref="operationOpenNoteProcessor"/> </map> </property> </bean> <!-- 短信管理器的拦截器 --> <bean id="noteManagerBeforeAdvice" class="com.jeyo.note.interceptor.NoteManagerBeforeAdvice"/> <bean id="noteManagerAfterReturningAdvice" class="com.jeyo.note.interceptor.NoteManagerAfterReturningAdvice"/> <!-- 短信管理器代理工厂 --> <bean id="noteManager" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyTargetClass" value="true"/> <property name="target" ref="noteManagerTarget"/> <property name="interceptorNames"> <list> <value>noteManagerBeforeAdvice</value> <value>noteManagerAfterReturningAdvice</value> </list> </property> </bean>
发表评论
-
设计模式概述
2015-10-11 00:17 877设计模式(Design pattern ... -
备忘录模式(Memento Pattern)
2010-04-10 22:58 1391在不破坏封装的前提下,捕获并且保持一个对象的内部状态,这样可以 ... -
中介者模式(Mediator Pattern)
2010-04-10 17:45 2040定义一个对象封装一系列的对象交互,使得对象之间不需要显式地相互 ... -
迭代器模式(Iterator Pattern)
2010-04-01 21:36 2414提供一种方法访问一个容器(container)对象中各个元素, ... -
解析器模式范例:阿拉伯数字金额转为中文数字金额
2010-03-31 20:27 1830表达式抽象类: public abstract class ... -
解析器模式(Interpreter Pattern)
2010-03-30 21:29 2030定义语言的文法,并且建立一个解释器来解释该语言中的句子。 ... -
命令模式(Command Pattern)
2010-03-29 21:34 1686命令模式本质是对命令的封装,从而把发出命令的责任和执行命令的责 ... -
责任链模式(Chain of Responsibility Pattern)
2010-03-28 11:28 1503责任链是用一系列类试图处理一个请求,这些类之间是一个松散的耦合 ... -
代理模式(Proxy Pattern)
2010-03-26 22:27 1518为其他对象提供一种 ... -
轻量级模式(Flyweight Pattern)
2010-03-25 23:47 1983轻量级模式实现对象的共享,从而减少内存分配的开销。该模式通常和 ... -
外观模式(Facade Pattern)
2010-03-25 22:39 1417外观模式,为子系统的一组接口提供一个统一的界面,此模式定义了 ... -
装饰模式(Decorator Pattern)
2010-01-28 23:50 2867动态给一个对象添加一些额外的职责。使用Decorator模式相 ... -
组合模式(Composite Pattern)
2010-01-26 22:22 4948组合模式主要是应对这样的问题:一类具有“容器特征”的对象 —— ... -
建造者模式(Builder Pattern)
2010-01-24 22:11 1395将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创 ... -
状态模式(State Pattern)
2010-01-11 20:29 1461一、状态模式需要两种类型实体参与: 1、状态管理器 ... -
桥接模式(Bridge Pattern)
2009-05-05 09:29 1383将抽象部分与实现部分分离,使得它们两部分可以独立地变化。 ... -
适配器模式(Adapter Pattern)
2009-04-10 13:08 1475将一个接口转换成为客户想要的另一个接口,适配器模式使接口不兼容 ... -
观察者模式(Observer Pattern)
2009-03-26 17:58 1536一、概念 定义对象间的一种一对多依赖关系,使得每当一 ... -
访问者模式(Visitor Pattern)
2009-03-23 16:21 1690一、概念 在不修改已有程序结构的前提下,通过添 ... -
策略模式(Strategy Pattern)
2009-03-18 15:21 1454策略模式的本质:少用继承,多用组合。 策略模式属于对象的行 ...
相关推荐
信息系统项目管理师论文范例4:论软件开发的风险管理doc.docx信息系统项目管理师论文范例4:论软件开发的风险管理doc.docx信息系统项目管理师论文范例4:论软件开发的风险管理doc.docx信息系统项目管理师论文范例4:...
《Java编程模式与范例》是一本深入探讨Java编程中常用设计模式和实践案例的书籍。这本书旨在帮助Java开发者理解和应用各种编程模式,提升代码质量和可维护性。设计模式是软件开发中的宝贵经验总结,它们代表了在特定...
ACCESS 2003 公司数据管理范例应用 与其他单纯介绍Access基本知识的图书不同,本书以Access 2003为平台,通过9个数据库系统的开发制作,为读者提供了极有针对性的应用范例,所有范例都是在公司办公管理中最典型的...
设计模式是软件工程中的一种最佳实践,它是在特定情境下为解决常见问题而形成的一套可复用的解决方案。在Java编程中,设计模式扮演着至关重要的角色,它能够提高代码的可读性、可维护性和可扩展性。本资料包含的是...
《Excel会计应用范例精解》是一本深入探讨如何利用Excel进行会计工作实践的专业书籍,旨在帮助会计人员提升工作效率和准确性。这本书涵盖了多个关键的会计系统应用,包括固定资产管理系统、财务报表编制系统、工资...
MVC(Model-View-Controller)设计模式是一种软件设计架构模式,广泛应用于Web应用开发,主要用于分离应用程序的业务逻辑、用户界面和数据处理。该模式将应用程序分为三个核心组件:模型(Model)、视图(View)和...
《Word高效应用范例宝典》是一本专为Word用户设计的实用指南,旨在帮助用户提升在日常工作中处理文档的效率。这本书包含了丰富的实例和详细的操作步骤,解答了用户在使用Word过程中可能遇到的各种问题,从基础功能到...
**Broker设计模式范例** 在软件工程中,`Broker`设计模式是一种结构型设计模式,它的主要作用是作为客户端和一组服务之间的中介,提供一种松散耦合的方式,使得客户端可以方便地请求服务,而无需了解服务的具体实现...
《Excel+VBA工资管理应用案例详解:范例文件》是一个综合性的教程资源,主要针对使用Excel和VBA进行工资管理的应用场景。该压缩包包含了实际操作中的范例文件,帮助用户深入理解如何利用这两项工具高效、准确地处理...
【JAVA编程模式与范例】这个压缩包文件主要聚焦于Java编程中的设计模式和实例应用。设计模式是软件工程中经过实践验证的、在特定场景下解决常见问题的有效方法,而Java作为广泛应用的面向对象编程语言,其设计模式的...
综上所述,Java编程模式与范例:基础开发技巧涵盖了广泛的知识点,包括但不限于基本语法、设计模式、并发编程、IO/NIO和最佳实践。掌握这些技巧,将有助于提升你的Java开发能力,使你在编程世界中游刃有余。通过不断...
"CVI虚拟仪器设计与应用 范例程序.rar"是一个包含有关虚拟仪器设计与应用的范例程序的压缩包。虚拟仪器(Virtual Instrumentation,简称VI)是一种使用软件技术来构建和定制测量及测试系统的工程方法。它利用图形化...
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板,可以被重复使用,以提高代码质量,提升系统可维护性和可扩展性。本资料库中的"design pattern设计模式范例"提供了23种经典设计模式以及...
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...
Java编程模式与范例:基础开发技巧是针对Java开发者的一本深入学习指南,旨在提升开发者在实际编程中的技能和效率。这本书涵盖了多种重要的编程模式和最佳实践,为初学者和有经验的Java开发者提供了丰富的知识资源。...
《C#设计模式从入门到精通(附范例程序)》是一本全面解析C#设计模式的教程,旨在帮助初学者快速理解并掌握设计模式在实际编程中的应用。设计模式是软件开发中的一种最佳实践,它总结了在特定场景下解决常见问题的经验...
以上内容只是Java编程模式与范例的一部分,实际的高级应用开发还会涉及到更多的概念和技术,如数据库操作、网络编程、分布式系统等。通过学习和实践,开发者可以不断提升自己的技能,适应不断变化的开发需求。
【标题】:“6范例1:毕业设计说明书1” 【描述】:本毕业设计说明书主要探讨的是基于SSM框架的在线考试系统,它是在“互联网+”背景下,应对传统考试方式挑战的一种信息技术创新。在线考试以其无纸化、灵活性和...
设计模式是软件工程中广泛使用的一系列最佳实践,它们可以帮助解决常见的软件设计问题。虽然确实存在许多以Java和C++语言描述的设计模式资源,但Delphi作为一种同样强大的编程语言,也有其特定的设计模式实现。以下...