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

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

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

  1. JAVA设计模式是个什么玩意儿_01_工厂方法模式

    1. 前言 工厂方法模式(Factory Method) 该模式属于创建型设计模式. 2. 定义 摘自<研磨设计模式> 陈臣.王斌 3.代码举例 public interface BMW ...

  2. Java 设计模式最佳实践:二、创建型模式

    原文:Design Patterns and Best Practices in Java 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],采用译后 ...

  3. JAVA设计模式(21):行为型-迭代器模式(Iterator)

    20世纪80年代,那时我家有一台"古老的"电视机,牌子我忘了,只记得是台黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,我印象最深的是那个用来换台的 ...

  4. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

  5. JAVA设计模式是个什么玩意儿_00_工厂模式家族准备篇_简单工厂模式

    1. 前言 又叫静态工厂方法(Static Factory Method)模式. 它并不是GoF那23种设计模式之一. 简单工厂模式是工厂模式家族中最简单实用的模式. 虽然很简单,但它是学习工厂方法模 ...

  6. 设计模式学习(四):Strategy策略模式

    一.什么是Strategy模式 Strategy的意思是"策略",指的是与敌军对垒时行军作战的方法.在编程中,我们可以将它理解为"算法".无论什么程序,其目的都 ...

  7. 象棋子 设计模式_通过设计国际象棋游戏了解策略模式

    象棋子 设计模式 今天,我们将借助一个示例来尝试了解策略模式. 我们将考虑的示例是国际象棋游戏. 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案. 策略模式:策略模式被称为行为模式–用 ...

  8. 《Head First 设计模式》阅读笔记(一)——策略模式

    上回将之前看过的章节都大致梳理了一遍,回过头去看的时候,发现看不懂了..太泛. 从这篇文章起,我想一个个详细的说明,当是复习了. 今天,先来讲述策略模式的故事. 为什么要用策略模式? 这一章从一开始便 ...

  9. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)

    <大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...

最新文章

  1. 二次开发photoshop_Photoshop 101:Web开发人员简介
  2. intellij手动添加依赖jar包
  3. jQuery 对HTML的操作(二)
  4. 自动装箱,拆箱和NoSuchMethodError
  5. 二进制安装mysql-5.7.26
  6. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
  7. linux下命令集合
  8. MySQL高级-MySQL锁
  9. remove() 删除节点 | detach() 删除节点 | empty() 清空节点的内容 | clone() 复制节点
  10. redis集群原理及搭建
  11. heic照片格式怎么转换jpg?heic转换成jpg方法分享
  12. python 做深度学习时偶遇的 (0xC0000409)错误
  13. 电脑城最简单骗局,仍然有无数人上当
  14. 传统语音识别介绍【四】—— 语言模型
  15. CentOS上使用docker安装redis
  16. 华为机试:计算最大乘积
  17. 力扣算法——78_子集
  18. Unity 获得Animator下某个动画片段的时长
  19. silverlight中TextBox控件的使用
  20. 乌江榨菜再涨价,“榨茅”是如何炼成的?

热门文章

  1. python有哪些常用的库
  2. 分步表单_角色创建分步指南
  3. 钮扣电池电压电量_纽扣厂
  4. java版spring cloud+spring boot+redis多租户社交电子商务平台 (十三)springboot集成spring cache...
  5. .net core高性能通讯开源组件BeetleX
  6. hadoop学习笔记(二):centos7三节点安装hadoop2.7.0
  7. etcd v3 集群——简单配置
  8. [APP]- 找回Xcode7的代码折叠功能
  9. spark streaming 的 Job创建、调度、提交
  10. 本地工程提交github