}

//是否需要扩容

private boolean atCapacity() {

int newSize = size + 1;

return newSize > elements.length;

}

//扩容

private void grow() {

Object[] newElements = new Object[elements.length + 10];

for (int i = 0; i < size; i++) {

newElements[i] = elements[i];

}

elements = newElements;

}

//增加一个元素

private void addElement(Object element) {

elements[size++] = element;

}

现在我们的add方法 仅仅就只有5行代码了。而可读性和第一版相比,真是天差地别。

如果你的类里面,public方法特别多,但是private方法特别少,那我觉得就一定还有优化的空间。

如果希望保持系统的简单性,那么就要尽可能的应用上述的组合方法进行细节上的重构,将一个个复杂的public方法,重构成一个个简单的private方法,最终对外暴露的public方法,只存在业务流程上对private方法的调用

下面继续看另外一个问题,在很多老项目中,屎山代码最大的特点就是if else太多,很多人即使知道有个叫策略模式的方法可以解决这个问题,但是却不敢下手,下面介绍一个例子,体会一下如何针对屎山代码的if else 动手。

采用这篇文章里的PayResult类, 现在往里面增加一个方法, 获取这次支付结果的积分。毕竟现在电商里买东西总要返点积分给你的。

//获取积分

public double getIntegral() {

//银联支付 按照1.5实际支付额度 返回积分

if (payChannel instanceof BankChannel) {

return paymentValue * 1.5;

} else if (payChannel instanceof WxChannel) {

//微信支付就按照实际支付额度两倍,然后减去券的金额

return paymentValue * 2 - couponValue;

} else if (payChannel instanceof AliPayChannel) {

//支付宝支付*2 ,然后还可以加上花呗支付的积分 马爸爸牛逼

return paymentValue * 2 + loanValue * 1;

}

return 0;

}

这样的代码项目里肯定不少见,我们现在来看看,怎么在一个成熟的系统里面,有惊无险的将这段代码优化一下。扩大一下可读性和可维护性。 毕竟很多人都知道大概怎么减少if else,但是真正实操起来 就往往做不到,不知道怎么做,也不敢做。

我们先弄一个积分策略类:

//积分策略

public class IntegralStrategy {

public double getIntegral() {

return 0;

}

}

然后把我们实际的积分算法逻辑 放到这个策略类里面

显然我们还需要一些参数,否则这些逻辑中需要引用的变量是找不到的 将外部的引用传进去:

//积分策略

public class IntegralStrategy {

public double getIntegral(PayResult payResult) {

//银联支付 按照1.5实际支付额度 返回积分

if (payResult.getPayChannel() instanceof BankChannel) {

return payResult.getPaymentValue() * 1.5;

} else if (payResult.getPayChannel() instanceof WxChannel) {

//微信支付就按照实际支付额度两倍,然后减去券的金额

return payResult.getPaymentValue() * 2 - payResult.getCouponValue();

} else if (payResult.getPayChannel() instanceof AliPayChannel) {

//支付宝支付*2 ,然后还可以加上花呗支付的积分 马爸爸牛逼

return payResult.getPaymentValue() * 2 + payResult.getLoanValue() * 1;

}

return 0;

}

}

然后修改一下我们的PayResult主类:

//获取积分

public double getIntegral() {

return integralStrategy.getIntegral(this);

}

//注意这个时候我们的全包构造函数 变成了private

private PayResult(PayChannel payChannel, Date payDate, Double totalValue, Double paymentValue, Double couponValue, Double loanValue) {

this.payChannel = payChannel;

this.payDate = payDate;

this.totalValue = totalValue;

this.paymentValue = paymentValue;

this.couponValue = couponValue;

this.loanValue = loanValue;

//也仅仅在这个构造函数 这里增加了一行代码

integralStrategy=new IntegralStrategy();

}

到这里,我们完成了初步的一个解耦工作,但是整体if else 的逻辑 还没
有完全去除,只是挪了一个地方而已, 继续优化.

这里需要注意的是:如果你的if else逻辑里面不需要主类太多的参数,那么也没必要直接传递主类的引用,只要 直接传递参数就可以,这里为了演示方便,我们直接传递了主类作为参数。

只传递参数,而不传递主类的引用有一个好处:只涉及上下文类与这些策略类的最小耦合

先去除if else

//积分策略

public abstract class IntegralStrategy {

abstract double getIntegral(PayResult payResult);

}

public class AliPayIntegralStrategy extends IntegralStrategy {

@Override

double getIntegral(PayResult payResult) {

return payResult.getPaymentValue() * 2 + payResult.getLoanValue() * 1;

}

}

public class UnionPayIntegralStrategy extends IntegralStrategy {

@Override

double getIntegral(PayResult payResult) {

return payResult.getPaymentValue() * 1.5;

}

}

public class WxPayIntegralStrategy extends IntegralStrategy {

@Override

double getIntegral(PayResult payResult) {

return payResult.getPaymentValue() * 2 - payResult.getCouponValue();

}

}

然后 更改一下我们的PayResult的构造方法:

//银联支付 注意看最后一个参数

public static PayResult createUnionPayResult(Date payDate, Double totalValue, Double paymentValue) {

return new PayResult(new BankChannel(), payDate, totalValue, paymentValue, 0.0d, 0.0d,new UnionPayIntegralStrategy());

}

//微信支付 注意看最后一个参数

public static PayResult createWxPayResult(Date payDate, Double totalValue, Double paymentValue, Double couponValue) {

return new PayResult(new WxChannel(), payDate, totalValue, paymentValue, couponValue, 0.0d,new WxPayIntegralStrategy());

}

//支付宝支付 注意看最后一个参数

public static PayResult createAliPayResult(PayChannel payChannel, Date payDate, Double totalValue, Double paymentValue, Double couponValue, Double loanValue) {

return new PayResult(new AliPayChannel(), payDate, totalValue, paymentValue, couponValue, 0.0d,new AliPayIntegralStrategy());

}

//注意看最后一个参数

//支付宝支付 注意看最后一个参数

public static PayResult createAliPayResult(PayChannel payChannel, Date payDate, Double totalValue, Double paymentValue, Double couponValue, Double loanValue) {

return new PayResult(new AliPayChannel(), payDate, totalValue, paymentValue, couponValue, 0.0d,new AliPayIntegralStrategy());

}

//注意看最后一个参数

如何用最小代价,迅速提高你项目中“shit,android设计模式有几种相关推荐

  1. uniapp android原生,在uni-app项目中集成Android原生工程

    [TOC] # 在uni-app项目中集成Android原生工程 按照官方的方案,我们如果进行本地打包的话,需要重新创建一个Android原生工程,于是就会导致我们管理多个项目,切来切去的也麻烦. 经 ...

  2. 商业项目中最受欢迎的 7 种编程语言

    [导读]:Semaphore 是一个国外持续集成/持续部署方案服务商.Semaphore 称自己在过去三年对其开发者用户进行调查,调查他们在开发商业项目时一般都使用哪些语言.这些数据基于成千上万个在  ...

  3. 软件项目中引用头文件的几种方法及要点

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 好的编程习惯,会直接影响代码的质量,在嵌入式C/C++中,头文件的引用方式和方法有多种,同时一些细节 ...

  4. 在你的项目中集成 Android pay支付

    设置Google Pay API Contents Before you get started开始之前 Configure your project配置你的项目  Add dependencies添 ...

  5. 安卓在项目中添加Android兼容包( v4、v7 、、、)

    如何选择兼容包, 一.查看SDK中是否有Support Library( v4.v7...) 注意该包是否在对应的SDK版本中!!! 二.没有则进行下载Support Library 方法1:右击项目 ...

  6. 【项目中】Android 小米红米手机无法读取照片图片路径的问题

    前两天在项目中实现了可本地选择照片的功能,今天同事告诉我他的小米手机没有办法选择照片,点击选中的照片后总是无法将照片传入到应用内,而在选择图片页面选择"本地",就可以成功选择照片和 ...

  7. 在idea项目中的android包不能识别_项目调试编译和部署运行

    项目调试 Logcat日志 顾名思义,logcat是android系统的日志包,提供给开发者供调试程序时使用.logcat一共有Verbose.Debug.Info.Warn.Error等不同级别的日 ...

  8. android图片缓存,直接应用项目中的Android图片缓存技术

    前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imag ...

  9. 项目连接不了mysql_关于Java项目中连接mysql失败的几种情况原因分析

    很多基础比较薄弱的童鞋对于Java链接mysql的错误原因不是很了解,今天我将罗列一下几种比较常见的错误类型,大家可以根据自己遇到的情况对号入座.密码错误导致的mysql连接不上,密码错误分为以下几种 ...

最新文章

  1. Asp.Net中查询域名的Whois信息
  2. Nature子刊:王四宝组揭示按蚊肠道共生菌抗疟的分子机制
  3. 图解全球无人驾驶产业链:这些公司在主宰人类出行的未来
  4. python之变量操作
  5. 【转自元宝兄】关于delphi Com+调用C# DLL的一点说明
  6. 【修正】销售开票BAPI实例:BAPI_BILLINGDOC_CREATEMULTIPLE
  7. gradle 构建过程
  8. vue修改计算属性的值_Vue语法高级之计算属性和侦听器
  9. 一起谈.NET技术,WPF Ribbon 开发资料分享
  10. CVPR 2019 | 条件运动传播:从运动中学习物体性质
  11. mfc远程连接mysql数据库连接_MFC连接mysql数据库(十分钟搞定)
  12. 20190601:第一个JDBC程序
  13. 解决ajax跨域的方法原理详解之Cors方法
  14. 每个创业者都是一本小说
  15. 小白也能看懂,30 分钟搭建个人博客!
  16. VS2019使用EasyX实现简单图形界面功能
  17. MPB:南农韦中组-​​根际细菌产铁载体能力的高通量检测
  18. 笔记本无线网卡开启wifi方法
  19. 机器人笔记psv中文_《机器人笔记》白金攻略 机器人笔记奖杯攻略
  20. win10系统桌面图标变为白色方框和去除桌面图标快捷方式小箭头的方法

热门文章

  1. 爬虫快速入门教程:爬虫应该怎么学
  2. 批处理set和if,goto共同使用
  3. 易览 v1.51 绿色
  4. 房地产估价师报考条件对专业要求?
  5. spamhaus PBL申诉
  6. 终于解决了闹心的ajax 200 parsererror
  7. 【K8S 基本理论及架构原理】
  8. Android播放提示音
  9. 液体混合控制装置PLC程序设计
  10. 无线鼠标显示是台式计算机,无线鼠标怎么用?台式机和笔记本使用无线鼠标的连接方法...