精通Java设计模式从初见到相爱之工厂+策略模式(3)

为什么80%的码农都做不了架构师?>>>   hot3.png

1、公司项目需求。

    用户签到活动,会员签到怎么处理,超级会员怎么处理,普通用户签到怎么处理,针对不同的档次,有不同的方案,所以在项目中用到了策略模式以及简单工厂模式。

    其实生活中,我们用到的软件系统都会有这样的制定级别,比如我们是实体店,他也有一个会员制度,打9折,打七折,打六折的都有,包括我们做头发,也都有不同级别的剪发卡.... 这些理发店啊、服装店啊还有什么美容spa店等等用的软件都会涉及,这就是我们所说的策略模式。

2、策略模式的概念

    概念:针对一类问题,用不同的方式的解决,这就是策略模式!

    举例1:明星演唱会,我们去买门票,路人甲买的一等座,路人乙买的二等座,路人丙买的外围座,虽然他们都能看到明星演唱,但是位置不同,针对买座位的不同级别来设置他们的观看明星位置,就是策略模式!

    举例2:去李宁专卖店买衣服,路人甲和路人乙买同一件衣服,虽然都能买到衣服,但是路人甲是会员,路人乙是普通用户,他们支付的钱不一样,路人甲花钱少,针对买衣服不同人的级别折扣不一样,就是策略模式!

3、代码实现

    项目中用到的比较多,例如商城会员、签到级别、游戏上、这种项目用的策略设计模式比较多

    说个场景,服装店,买衣服,会员级别分别是:AVip、BVip、CVip 和没有会员的用户NoVip,四个级别,打折情况分别是0.6、0.7、0.9和没有打折

    打折的接口

public interface DisCount {//买东西给折扣Double disCount(Double money);
}

不同会员级别的实现类,不同的折扣

package ceLve;public class AVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.6 ;}
}
package ceLve;public class BVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.7;}
}
package ceLve;public class CVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.9;}
}
package ceLve;public class NoVip implements DisCount {//普通用户不能打折@Overridepublic Double disCount(Double money) {return money;}
}
package ceLve;public class Customer  {//客户消费总金额private Double totalAccount =0D;//客户目前消费金额private Double currentAccount = 0D;//默认消费者 没有会员等级private DisCount disCount = new NoVip();//消费者 消费商品、衣服的方法public void buy(Double money){this.currentAccount = money;totalAccount       += money;if (totalAccount >= 10000){disCount= new AVip();}else if (totalAccount >= 6000){disCount= new BVip();}else if (totalAccount >= 3000){disCount= new CVip();}else {disCount= new NoVip();}}// 消费者支付public double pay(){return disCount.disCount(currentAccount);}public Double getTotalAccount() {return totalAccount;}public void setTotalAccount(Double totalAccount) {this.totalAccount = totalAccount;}public Double getCurrentAccount() {return currentAccount;}public void setCurrentAccount(Double currentAccount) {this.currentAccount = currentAccount;}}

最后在main函数中执行:

package ceLve;public class Main {public static void main(String[] args){Customer customer = new Customer();customer.buy(5000.00);System.out.println(customer.pay());}
}

运行结果:4500.00

    上面是纯粹的是策略模式,现在我要加上简单工厂模式,其实加上与不加上没有什么区别,就自我感觉就是吃饭为什么非要用右手使用筷子,而不是左手,小时候家长我只要用左手就打我手。因为我们中国的传统就是右手,所以因为传统的原因,目前简单工厂设计模式也如此,也基本没什么用,但有人会说硬编码,不能随随便便new,那好吧,今天把简单工厂模式也加进去。

    修改方案:修改Customer类,新增简单工厂类CountFactory

package ceLve;public class Customer  {//客户消费总金额private Double totalAccount =0D;//客户目前消费金额private Double currentAccount = 0D;//默认消费者 没有会员等级private DisCount disCount = new NoVip();//消费者 消费商品、衣服的方法public void buy(Double money){this.currentAccount = money;totalAccount       += money;disCount = CountFactory.createCount(this);}// 消费者支付public double pay(){return disCount.disCount(currentAccount);}public Double getTotalAccount() {return totalAccount;}public void setTotalAccount(Double totalAccount) {this.totalAccount = totalAccount;}public Double getCurrentAccount() {return currentAccount;}public void setCurrentAccount(Double currentAccount) {this.currentAccount = currentAccount;}}
public class CountFactory {private CountFactory(){}public static DisCount createCount(Customer customer){if (customer.getTotalAccount() >= 10000){return new AVip();}else if (customer.getTotalAccount() >= 6000){return new BVip();}else if (customer.getTotalAccount() >= 3000){return new CVip();}else {return new NoVip();}}
}

main函数代码不变

结果依然4500.00

其实大家看下来就感觉没那么多必要的,我直接if else也可以解决的,没有这么麻烦呀,不对的,简单的小项目可以这样,但是如果活动量增加的话,没必要在controller或者service层去判断它应用那种策略,他其实说白了就是一个处理方式的一个工具类!我们把它封装好,什么时候用,什么时候调用就好,就像jdk中的时间,其实我们项目中也会有很多工具类,他其实有点类似那样!

    

 

转载于:https://my.oschina.net/mdxlcj/blog/1787501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery weui 中alert弹出框在ios中跳动问题

问题描述: jquery-weui中的弹出框在ios上会有一个右下角向中间滑动的效果,在Android上没有这个效果。 解决方法: 修该jquery-weui.js中的openModal方法如下图: 转载于:https://www.cnblogs.com/xianZJ/p/6773097.html

WPF效果第一百九十五篇之又玩ListBox

ListBox一直是我的最爱;今天再次基于他玩耍一下不一样的效果;闲话不多扯直接看效果:1、这次直接用的ItemContainerStyle:2、通过HitTest实现点选边框:Point point e.GetPosition(LightDarkListBox); VisualTreeHelper.HitTest(LightDarkListBox, new HitTestFilter…

Web3,互联网新造神“机器”?

本文来自微信公众号:每经头条 (ID:nbdtoutiao),作者:李蕾,编辑:肖芮冬,头图来自:视觉中国 “与目前的互联网相比,Web3基于区块链等底层技术&#…

Gradle实战:发布aar包到maven仓库

查看原文:http://blog.csdn.net/u0108184... Gradle实战系列文章:《Gradle基本知识点与常用配置》《Gradle实战:Android多渠道打包方案汇总》《Gradle实战:不同编译类型的包同设备共存》《Gradle实战:执行sql操作hive…

synchronized与Lock的区别

类别synchronizedLock存在层次Java的关键字,在jvm层面上是一个类锁的释放1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁在finally中必须释放锁,不然容易造成线程死锁锁的获取假设A线程获得锁&am…

even兼容

var eventarguments.callee.caller.arguments[0]||window.event;//消除浏览器差异 var ewindow.event||event; //消除浏览器差异 转载于:https://www.cnblogs.com/webqiand/articles/11250768.html

普通中年人的真实出路

阅读本文大概需要6分钟。互联网人甚至中国整体的用工市场的确有中年淘汰的问题,我们可以当它不存在,甚至当有人给出解法的时候,我们也可以认为他们在传播焦虑,但事实就是事实,它的存在不随个人意愿而转移。最近抖音上有…

项目管理常见的问题

综合管理 缺乏企业级的项目管理平台;项目目标不清楚;项目经理不了解项目管理流程和工具;项目模板不统一;计划意识薄弱,缺乏规范的分解。难以过程监控,实时地了解项目进度,靠手工统计和汇报项目进度,难以真实反映进度。项目控制不力&#xff0…

常用小提示

阿里云Linux安装软件镜像源 第一步:备份你的原镜像文件,以免出错后可以恢复。 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup第二步:下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc…

抽象工厂模式(Absraact Factory)介绍与实现

创建一个IProduct,后面模拟业务时要用到 package com.xiawei.factory; public class IProduct { private String productNo "";} package com.xiawei.factory;/** * 规范工厂接口 </p> *///创建一个所有工厂的规范接口,后面所有的工厂类都要来实现这个接口,并…

【温故知新】C# Linq中 Select SelectMany 使用技巧

微信公众号&#xff1a;趣编程ACE关注可了解更多的.NET日常实战开发技巧&#xff0c;如需源码 后台回复 源码 即可;如果觉得对你有帮助&#xff0c;欢迎关注C# Linq中 Select && SelectMany 使用技巧Select 和 SelectMany 是我们开发中对集合常用的两个扩展方法&#x…

bzoj4870

http://www.lydsy.com/JudgeOnline/problem.php?id4870 矩阵快速幂。。。 人话题意&#xff1a;从nk个物品里选模k余r个物品&#xff0c;问方案数模P 那么我们有方程 f[i][j]f[i-1][j]f[i-1][j-1] 跟组合数一个样子 j∈(0,k) 这个物品选还是不选加起来 构造矩阵&#xff1a;x.…

15000 字的 SQL 语句大全,值得收藏!

基础 1、说明&#xff1a;创建数据库 CREATE DATABASE database-name 2、说明&#xff1a;删除数据库 drop database dbname 3、说明&#xff1a;备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat -…

Codeforces Round #410 (Div. 2) D. Mike and distribution 思维+数学

链接&#xff1a; http://codeforces.com/contest/798/problem/D 题意&#xff1a; 给你两个长度为n的数列a和b&#xff0c;让你选n/21个下标&#xff0c;使得2*∑ai>suma,2*∑bi>sumb 题解1&#xff1a; 用一个叫random_shuffle的东西&#xff0c;每次都乱选&#xff0c…

PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏

一&#xff1a;背景 上一篇我们聊到了如何用 PerfView 去侦察 NTHeap 的内存泄漏&#xff0c;这种内存泄漏往往是用 C 的 malloc 或者 C 的 new 分配而不释放所造成的&#xff0c;这一篇我们来聊一下由 VirtualAlloc 方法造成的泄漏如何去甄别&#xff1f;了解 VirtualAlloc 的…

[APP]- 找回Xcode7的代码折叠功能

为什么80%的码农都做不了架构师&#xff1f;>>> 原 找回Xcode7的代码折叠功能 升级到Xcode7后&#xff0c;会发现代码折叠功能不见了&#xff0c;这是怎么回事&#xff1f; 其实这个功能还在的&#xff0c;只是苹果默认把这个功能禁掉了&#xff1a;在Xcode菜单里选…

有哪些值得推荐的.NET ORM框架?

前言&#xff1a; 最近有很多同学问我.NET方面有哪些好用的ORM框架&#xff0c;我觉得这方面的介绍网上应该会介绍的比较全面文章&#xff0c;于是我想搜一篇全面的介绍文章发给他们结果我发现网上说来说去基本上就是那几个&#xff0c;于是就有了这篇文章。 什么是ORM? ORM 是…

从S3中导入数据到Dynamodb

本节如果你已经从Dynamodb中导出过数据&#xff0c;而且导出的文件以及被存入S3。文件内部结构会在Verify Data Export File 中描写叙述。我们称之前导出数据的原始表为source table&#xff0c;数据将要被导入的表为destination table。你能够将S3中的导出文件导入到dynamodb的…

HTML5程序开发范例宝典 完整版 (韩旭等著) 中文pdf扫描版

HTML5程序开发范例宝典紧密围绕编程者在编程中遇到的实际问题和开发中应该掌握的技术&#xff0c;全面介绍了利用HTML进行程序开发的各方面技术和技巧。全书共16章&#xff0c;内容包括HTML网页布局、HTML基本元素、HTML高级元素、表单的使用、列表的使用、超链接、表格应用、图…

ASP.NET Core 6框架揭秘实例演示[11]:诊断跟踪的几种基本编程方式

在整个软件开发维护生命周期内&#xff0c;最难的不是如何将软件系统开发出来&#xff0c;而是在系统上线之后及时解决遇到的问题。一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案&#xff0c;一个更好的程序员能够根据当前的运行状态预知未来可…