`
raymond.chen
  • 浏览: 1426282 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

设计模式应用范例(一):上行短信管理器

阅读更多

     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>

  

  • 大小: 61.3 KB
2
0
分享到:
评论
1 楼 wangyi2200 2010-09-21  
感谢,受教~

相关推荐

    信息系统项目管理师论文范例4:论软件开发的风险管理doc.docx

    信息系统项目管理师论文范例4:论软件开发的风险管理doc.docx信息系统项目管理师论文范例4:论软件开发的风险管理doc.docx信息系统项目管理师论文范例4:论软件开发的风险管理doc.docx信息系统项目管理师论文范例4:...

    Java编程模式与范例pdf

    《Java编程模式与范例》是一本深入探讨Java编程中常用设计模式和实践案例的书籍。这本书旨在帮助Java开发者理解和应用各种编程模式,提升代码质量和可维护性。设计模式是软件开发中的宝贵经验总结,它们代表了在特定...

    access 2003公司数据管理范例应用

    ACCESS 2003 公司数据管理范例应用 与其他单纯介绍Access基本知识的图书不同,本书以Access 2003为平台,通过9个数据库系统的开发制作,为读者提供了极有针对性的应用范例,所有范例都是在公司办公管理中最典型的...

    设计模式 java 范例 代码

    设计模式是软件工程中的一种最佳实践,它是在特定情境下为解决常见问题而形成的一套可复用的解决方案。在Java编程中,设计模式扮演着至关重要的角色,它能够提高代码的可读性、可维护性和可扩展性。本资料包含的是...

    Excel会计应用范例精解

    《Excel会计应用范例精解》是一本深入探讨如何利用Excel进行会计工作实践的专业书籍,旨在帮助会计人员提升工作效率和准确性。这本书涵盖了多个关键的会计系统应用,包括固定资产管理系统、财务报表编制系统、工资...

    MVC设计模式范例

    MVC(Model-View-Controller)设计模式是一种软件设计架构模式,广泛应用于Web应用开发,主要用于分离应用程序的业务逻辑、用户界面和数据处理。该模式将应用程序分为三个核心组件:模型(Model)、视图(View)和...

    Word高效应用范例宝典

    《Word高效应用范例宝典》是一本专为Word用户设计的实用指南,旨在帮助用户提升在日常工作中处理文档的效率。这本书包含了丰富的实例和详细的操作步骤,解答了用户在使用Word过程中可能遇到的各种问题,从基础功能到...

    Broker设计模式范例

    **Broker设计模式范例** 在软件工程中,`Broker`设计模式是一种结构型设计模式,它的主要作用是作为客户端和一组服务之间的中介,提供一种松散耦合的方式,使得客户端可以方便地请求服务,而无需了解服务的具体实现...

    J:\Excel\EXCEL+VBA工资管理应用案例详解:范例文件.rar

    《Excel+VBA工资管理应用案例详解:范例文件》是一个综合性的教程资源,主要针对使用Excel和VBA进行工资管理的应用场景。该压缩包包含了实际操作中的范例文件,帮助用户深入理解如何利用这两项工具高效、准确地处理...

    [JAVA编程模式与范例].zip

    【JAVA编程模式与范例】这个压缩包文件主要聚焦于Java编程中的设计模式和实例应用。设计模式是软件工程中经过实践验证的、在特定场景下解决常见问题的有效方法,而Java作为广泛应用的面向对象编程语言,其设计模式的...

    Java编程模式与范例:基础开发技巧

    综上所述,Java编程模式与范例:基础开发技巧涵盖了广泛的知识点,包括但不限于基本语法、设计模式、并发编程、IO/NIO和最佳实践。掌握这些技巧,将有助于提升你的Java开发能力,使你在编程世界中游刃有余。通过不断...

    CVI虚拟仪器设计与应用 范例程序.rar

    "CVI虚拟仪器设计与应用 范例程序.rar"是一个包含有关虚拟仪器设计与应用的范例程序的压缩包。虚拟仪器(Virtual Instrumentation,简称VI)是一种使用软件技术来构建和定制测量及测试系统的工程方法。它利用图形化...

    design pattern设计模式范例

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板,可以被重复使用,以提高代码质量,提升系统可维护性和可扩展性。本资料库中的"design pattern设计模式范例"提供了23种经典设计模式以及...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    Java编程模式与范例:基础开发技巧

    Java编程模式与范例:基础开发技巧是针对Java开发者的一本深入学习指南,旨在提升开发者在实际编程中的技能和效率。这本书涵盖了多种重要的编程模式和最佳实践,为初学者和有经验的Java开发者提供了丰富的知识资源。...

    c#设计模式从入门到精通(附范例程序)

    《C#设计模式从入门到精通(附范例程序)》是一本全面解析C#设计模式的教程,旨在帮助初学者快速理解并掌握设计模式在实际编程中的应用。设计模式是软件开发中的一种最佳实践,它总结了在特定场景下解决常见问题的经验...

    java编程模式与范例:高级应开发

    以上内容只是Java编程模式与范例的一部分,实际的高级应用开发还会涉及到更多的概念和技术,如数据库操作、网络编程、分布式系统等。通过学习和实践,开发者可以不断提升自己的技能,适应不断变化的开发需求。

    6范例1:毕业设计说明书1

    【标题】:“6范例1:毕业设计说明书1” 【描述】:本毕业设计说明书主要探讨的是基于SSM框架的在线考试系统,它是在“互联网+”背景下,应对传统考试方式挑战的一种信息技术创新。在线考试以其无纸化、灵活性和...

    Delphi设计模式讲解代码示例讲解

    设计模式是软件工程中广泛使用的一系列最佳实践,它们可以帮助解决常见的软件设计问题。虽然确实存在许多以Java和C++语言描述的设计模式资源,但Delphi作为一种同样强大的编程语言,也有其特定的设计模式实现。以下...

Global site tag (gtag.js) - Google Analytics