设计模式在开发中的应用

编程入门 行业动态 更新时间:2024-10-20 20:54:10

设计<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式在开发中的应用"/>

设计模式在开发中的应用

初学java时,大家应该学习过java I/O章节,各个对象之间随意嵌套,完全摸不清头脑,反正我当时是一脸懵逼的,下面给出了一个简化的类关系图,可以看出整个图由四个部分组成:抽象父类,被装饰者,抽象装饰者,具体装饰者。

将上图简化就可以得到装饰者模式的UML类图

为了方便大家理解,下面我们使用商品价格计算这个例子来举例说明
大家在各种电商网站上购买商品时,经常会使用到满减券、打折券等优惠,当我们选择使用上述优惠时,我们需要支付的金额就会自动抵扣。那么这套逻辑是怎么实现的呢?
首先我们对上面这个例子进行拆分,可以获取到的信息有:商品、优惠、价格,商品价格 - 优惠金额 = 支付金额。
现在我们有满减券、打折券,将来运营人员会提出其他营销方案、比如积分抵扣、会员权益等,设想下现在由你来设计这套系统,应该怎么做?

下面我们就是用设计模式来解决上述问题
我们从上面提取的信息有商品、优惠、价格。其中商品就是被装饰者、优惠就是抽象装饰者(打折、满减是具体装饰者),他们共同实现一个功能就是计算实际支付价格。经过分析我们已经找到了四个对象中的三个,剩下的就是抽象父类,这个我们可以手动创建。下面我们来一一创建这些对象

-------------------------------- 抽象父类 -----------------------------------------
/**
* 抽象父类
*/
public abstract class  Component{/*** 计算商品价格*/public void calcPrice(){}
}
-------------------------------- 被装饰者 -----------------------------------------
/**
* 商品
*/
public class Commodity extends Component{private BigDecimal price;public Commodity(BigDecimal price){this.price = price;}/*** 商品的计算价格方法可以理解为没有任何优惠活动,因此此处可以不去实现,我这里写出来只是为了让大家更好的理解*/public void calcPrice(){}
}-------------------------------- 抽象装饰者 -----------------------------------------
/**
* 优惠活动
*/
public abstract Activity extends Component{private Component component;
}-------------------------------- 业务类 -----------------------------------------
/**
* 满减券
*/
public class FullReduce{private BigDecimal full;private BigDecimal reduce;public FullReduce(BigDecimal full, BigDecimal reduce){this.full = full;this.reduce = reduce;}
}/**
* 折扣券
*/
public class Discount{private BigDecimal maxReduce;private BigDecimal discount;
}-------------------------------- 具体装饰者 -----------------------------------------
/**
* 满减计算
*/
public class FullReduceActivity extends Activity{// 满减实体类,包含满减计算时需要的信息,比如:满100减10private FullReduce fullReduce; public FullReduceActivity(Component component, FullReduce fullReduce){thisponent = component;this.fullReduce = fullReduce;}public void calc(){component.calc();calcReduce();}/*** 具体实现满减计算*/public void calcReduce(){//TODO 结合具体业务实现满减代码}
}/**
* 折扣计算
*/
public class DiscountActivity extends Activity{// 折扣实体类,包含折扣计算时需要的信息,比如:打8折,最高优惠50private Discount discount;public DiscountActivity(Component component, Discount discount){thisponent = component;this.discount = discount;}public void calc(){component.calc();calcDsicount();}/*** 具体实现这块计算*/public void calcDiscount(){//TODO 结合具体业务实现折扣代码}
}-------------------------------- 装饰者测试类 -----------------------------------------
public class DecoratorTest{public static void main(String[] args){// 1.创建业务类// 创建满减券,满100减10FullReduce fullReduce = new FullReduce(100, 10);// 创建折扣券,8折,最高优惠50Discount discount = new Discount(50, 8);// 2.创建商品Commodity commodity = new Commodity(500);// 3.测试满减活动Component fullReduceActivity = new FullReduceActivity(commodity, fullReduce);fullReduceActivity.calc();// 4.测试折扣活动Component discountActivity = new DiscountActivity(commodity, fullReduce);discountActivity.calc();// 5.先满减再打折fullReduceActivity = new FullReduceActivity(commodity, fullReduce);Component component = new DiscountActivity(fullReduceActivity, discount)component.calc();// 6.先打折在满减discountActivity = new DiscountActivity(commodity, fullReduce);Component component = new FullReduceActivity(discountActivity, fullReduce);component.calc();}
}

以上是使用装饰者模式实现的价格计算,试想下如果运营提出积分抵扣,那需要如何改动呢?
1.新建一个积分业务类,包含具体的业务字段
2.新建一个积分抵扣活动类,实现具体的积分抵扣逻辑,然后放入calc方法中。

装饰者允许我们灵活的组合优惠活动,因此我们只需要结合具体的活动规则去组合想要的活动即可。

更多推荐

设计模式在开发中的应用

本文发布于:2024-03-08 17:52:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1721699.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!