`
txidol
  • 浏览: 54799 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【策略模式】模拟Struts选择策略决策转移

 
阅读更多

目标:我们需要一个计算价格的类,有时候会打折

1.我们先设计一个接口

public interface PriceCalculationStrategy {
		
	public double calculatePrice(double price , double copies);
	
	public boolean match(double price , double copies);
}
2.我们有一些计算实现

public class DefaultDiscountPriceCalStrategy implements PriceCalculationStrategy{
	public double rate = 0.1;
	
	public double calculatePrice(double price, double copies) {
		return price * copies * rate; 
	}

	@Override
	public boolean match(double price, double copies) {
		return false;		//这是不可能的
	}

}
public class NoDiscountPriceCalStrategy implements PriceCalculationStrategy{
	
	public double calculatePrice(double price, double copies) {
		return price * copies;
	}

	public boolean match(double price, double copies) {
		return price < 300;			
	}

}
public class DiscountPriceCalStrategy implements PriceCalculationStrategy{
		
	public double rate ;
	
	public double calculatePrice(double price, double copies) {
		return price * copies * rate;
	}

	public void setDiscount(double rate) {
		this.rate = rate;
	}

	public boolean match(double price, double copies) {
		boolean match = false;		
		if(price >= 300 && price <1000){
			setDiscount(0.9);
			match = true;
		}else if( price >=1000){
			setDiscount(0.8);
			match = true;
		}		
		return match;
	}
}
3.计算工具类,发现我们根本不要自己判断,每个策略自己判断执不执行

public class PriceCalculationUtil {
			
	public static List<PriceCalculationStrategy> priceCalculationStrategys = new ArrayList<PriceCalculationStrategy>();
	
	static{ //等价于  容器内查找所有策略
		PriceCalculationStrategy pcs = new NoDiscountPriceCalStrategy();		
		PriceCalculationStrategy pcs1 = new DiscountPriceCalStrategy();		
		DefaultDiscountPriceCalStrategy defaultD =new DefaultDiscountPriceCalStrategy();  
		priceCalculationStrategys.add(pcs);
		priceCalculationStrategys.add(pcs1);
		priceCalculationStrategys.add(defaultD);
	}
	
	public static double priceCalculation(double price , double copies) {				
		
		for (PriceCalculationStrategy strategy : priceCalculationStrategys) {
			 if( strategy.match(price, copies)){
				 return strategy.calculatePrice(price, copies);
			 }				
		}
		
		//优先其他策略,我不会告诉你我打的广告“ 1折 商品  ” 是假的,你看我有这个策略的
		DefaultDiscountPriceCalStrategy defaultD = new DefaultDiscountPriceCalStrategy();  
		return defaultD.calculatePrice(price, copies);
	}			
}
4.测试

public class PriceCalculationUtilTest {

	@Test
	public void testPriceCalculation(){		
		assertEquals(200,PriceCalculationUtil.priceCalculation(100, 2),0);
		assertEquals(360,PriceCalculationUtil.priceCalculation(400, 1),0);
		assertEquals(800,PriceCalculationUtil.priceCalculation(1000, 1),0);		
	}	
}


分享到:
评论

相关推荐

    servlet模拟struts1工作原理

    总之,模拟Struts1的过程是一个很好的学习方式,它帮助开发者理解MVC模式和框架如何协调工作,同时也能提升对Servlet的理解。实际开发中,虽然Struts1已经被Struts2和其他现代框架取代,但了解其工作原理对理解和...

    Servlet简单模拟Struts2

    Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,它简化了Java Web应用的开发,提供了强大的动作(Action)管理和拦截器(Interceptor)机制。它的主要优点在于它能够通过配置文件灵活地映射请求...

    模拟struts

    在"模拟Struts"这个项目中,你可能已经尝试实现了Struts框架的核心功能,让我们深入探讨一下Struts的关键知识点。 1. **MVC设计模式**:MVC是一种将业务逻辑、数据和用户界面分离的设计模式。在Struts中,模型...

    MVC模式和Struts框架

    MVC模式和Struts框架

    自己模拟实现struts的dispatcherAction

    在模拟实现中,可以选择适合的解析方式,读取Action的类名、方法名以及请求路径的映射关系。 5. **创建XML配置文件**: struts-config.xml文件应包含Action的定义,如Action的类名、请求路径与Action之间的映射等...

    模拟struts2框架代码.rar_模拟struts框架

    Struts2是一个强大的Java web应用...通过这样的模拟实现,我们可以深入理解Struts2框架的工作原理,以及MVC模式在实际开发中的应用。这将有助于我们更好地使用和优化Struts2框架,提高Java web应用的开发效率和质量。

    用servlet模拟struts_mvc框架

    总结来说,Servlet模拟Struts_MVC是一个学习MVC模式的好方法,它让我们亲身体验到控制器如何调度模型和视图,以及它们之间如何协作完成Web应用的处理流程。通过这样的实践,我们可以深入理解MVC模式的优势,为将来...

    模拟STRUTS的小项目

    总之,通过模拟Struts的小项目,开发者可以亲手实践MVC模式,理解Struts框架如何协调不同的组件,以及如何有效地组织和管理Java Web应用的各个部分。这个过程有助于提升对Web开发的理解,为进一步学习其他框架,如...

    servelt模拟struts1框架

    然而,在没有实际的Struts1环境时,我们可以通过使用Servlet来模拟其工作原理,以便理解Struts1的核心机制。本教程将通过Servlet来解析XML配置文件、处理请求和自动封装数据,从而实现类似Struts1的功能。 首先,...

    struts2简单模拟

    通过实践简单的Struts2模拟代码,可以更好地理解和体验Struts2框架的工作原理和优势。在实际开发中,还需要不断学习和熟悉Struts2的高级特性,如自定义拦截器、类型转换、插件使用等,以提升开发能力。

    模拟Struts框架

    模拟Struts框架

    struts2框架模拟-教学示范代码

    Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护、结构清晰的web应用的工具。本教学示范代码是针对Struts2自定义框架的实践操作,旨在帮助...

    J2EE基础:MVC模式和Struts模式的理解

    Struts是一个基于MVC模式的开源Java Web框架,它简化了Java Web应用程序的开发。在Struts中: - **ActionServlet**:作为控制器,处理HTTP请求,并调用相应的Action。 - **Action**:实现了特定业务逻辑的类,相当...

    利用模拟Struts做简易博客

    在这个“利用模拟Struts做简易博客”的项目中,我们可以通过Struts来构建一个简单易用的博客系统,允许用户发布、编辑和查看文章。以下是关于这个项目的一些关键知识点: 1. **Struts框架**:Struts是Apache软件...

    模拟struts1写的代码+文档分析

    这个压缩包文件包含了模拟Struts1框架编写的代码和相关的文档,这对于理解Struts1的工作原理以及如何在实际项目中应用它非常有帮助。 1. **Struts1框架概述** Struts1是一个基于Model-View-Controller (MVC)设计...

    模拟struts2代码+文档

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Web开发领域具有广泛的应用。这个"模拟Struts2代码+文档"的压缩包很可能包含了一个简化的Struts2应用实例和相关的技术文档,...

    模拟Struts

    模拟Struts的工作原理编程实现模拟技术

    模拟Struts责任链工作流及简单AOP实现

    在Struts中,责任链模式(Chain of Responsibility)是一种核心的设计模式,用于处理请求的分发。这个模式允许将多个处理器(或者叫做拦截器)链接在一起,形成一个链,每个处理器都有机会处理请求,或者将请求传递...

    Struts开发模式经验总结

    配置Struts开发环境通常包括安装JDK,选择合适的IDE(如JBuilder9),设置Tomcat服务器,以及安装Struts库。在JBuilder中,可以通过添加库的方式引入Struts的jar文件,Tomcat的配置涉及修改server.xml文件,确保...

    模拟Struts功能--最后的一些实体bean以及源码下载

    Struts是一个著名的Java Web开发框架,它以Model-View-Controller(MVC)设计模式为核心,简化了Web应用的开发。在"模拟Struts功能--最后的一些实体bean以及源码下载"这个主题中,我们可以深入探讨Struts框架的核心...

Global site tag (gtag.js) - Google Analytics