目标:我们需要一个计算价格的类,有时候会打折
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);
}
}
分享到:
相关推荐
总之,模拟Struts1的过程是一个很好的学习方式,它帮助开发者理解MVC模式和框架如何协调工作,同时也能提升对Servlet的理解。实际开发中,虽然Struts1已经被Struts2和其他现代框架取代,但了解其工作原理对理解和...
Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,它简化了Java Web应用的开发,提供了强大的动作(Action)管理和拦截器(Interceptor)机制。它的主要优点在于它能够通过配置文件灵活地映射请求...
在"模拟Struts"这个项目中,你可能已经尝试实现了Struts框架的核心功能,让我们深入探讨一下Struts的关键知识点。 1. **MVC设计模式**:MVC是一种将业务逻辑、数据和用户界面分离的设计模式。在Struts中,模型...
MVC模式和Struts框架
在模拟实现中,可以选择适合的解析方式,读取Action的类名、方法名以及请求路径的映射关系。 5. **创建XML配置文件**: struts-config.xml文件应包含Action的定义,如Action的类名、请求路径与Action之间的映射等...
Struts2是一个强大的Java web应用...通过这样的模拟实现,我们可以深入理解Struts2框架的工作原理,以及MVC模式在实际开发中的应用。这将有助于我们更好地使用和优化Struts2框架,提高Java web应用的开发效率和质量。
总结来说,Servlet模拟Struts_MVC是一个学习MVC模式的好方法,它让我们亲身体验到控制器如何调度模型和视图,以及它们之间如何协作完成Web应用的处理流程。通过这样的实践,我们可以深入理解MVC模式的优势,为将来...
总之,通过模拟Struts的小项目,开发者可以亲手实践MVC模式,理解Struts框架如何协调不同的组件,以及如何有效地组织和管理Java Web应用的各个部分。这个过程有助于提升对Web开发的理解,为进一步学习其他框架,如...
然而,在没有实际的Struts1环境时,我们可以通过使用Servlet来模拟其工作原理,以便理解Struts1的核心机制。本教程将通过Servlet来解析XML配置文件、处理请求和自动封装数据,从而实现类似Struts1的功能。 首先,...
通过实践简单的Struts2模拟代码,可以更好地理解和体验Struts2框架的工作原理和优势。在实际开发中,还需要不断学习和熟悉Struts2的高级特性,如自定义拦截器、类型转换、插件使用等,以提升开发能力。
模拟Struts框架
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护、结构清晰的web应用的工具。本教学示范代码是针对Struts2自定义框架的实践操作,旨在帮助...
Struts是一个基于MVC模式的开源Java Web框架,它简化了Java Web应用程序的开发。在Struts中: - **ActionServlet**:作为控制器,处理HTTP请求,并调用相应的Action。 - **Action**:实现了特定业务逻辑的类,相当...
在这个“利用模拟Struts做简易博客”的项目中,我们可以通过Struts来构建一个简单易用的博客系统,允许用户发布、编辑和查看文章。以下是关于这个项目的一些关键知识点: 1. **Struts框架**:Struts是Apache软件...
这个压缩包文件包含了模拟Struts1框架编写的代码和相关的文档,这对于理解Struts1的工作原理以及如何在实际项目中应用它非常有帮助。 1. **Struts1框架概述** Struts1是一个基于Model-View-Controller (MVC)设计...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Web开发领域具有广泛的应用。这个"模拟Struts2代码+文档"的压缩包很可能包含了一个简化的Struts2应用实例和相关的技术文档,...
模拟Struts的工作原理编程实现模拟技术
在Struts中,责任链模式(Chain of Responsibility)是一种核心的设计模式,用于处理请求的分发。这个模式允许将多个处理器(或者叫做拦截器)链接在一起,形成一个链,每个处理器都有机会处理请求,或者将请求传递...
配置Struts开发环境通常包括安装JDK,选择合适的IDE(如JBuilder9),设置Tomcat服务器,以及安装Struts库。在JBuilder中,可以通过添加库的方式引入Struts的jar文件,Tomcat的配置涉及修改server.xml文件,确保...
Struts是一个著名的Java Web开发框架,它以Model-View-Controller(MVC)设计模式为核心,简化了Web应用的开发。在"模拟Struts功能--最后的一些实体bean以及源码下载"这个主题中,我们可以深入探讨Struts框架的核心...