《重构与模式》简化-积木系列

composed method:

我们平时在写代码的过程中也会吧一些复杂的代码分解成几个小方法,以使代码开起来清晰,而composed method只是将实践定义成理论而已。不过我认为他核心的原则是尽可能将重构的方法保持在同一细节水平上。

strategy:

核心是将复杂条件从算法中抽离,使算法纯净到可以抽象为统一行为的逻辑。如此即可抽象出各种strategy出来。

然后用context来调用各个strategy,而实用哪一个strategy由客户端来决定。

举个例子我们在代码里经常会遇这种代码:

if (vipType == 1) {
 }
if (vipType == 2) {

}
if (vipType == 1 && null != pricePromotion && null != pricePromotion.getVipPrice()) {

} else if (vipType == 2 && null != priceInfo && null != priceInfo.getOldPrice()) {

} else if (null != pricePromotion && null != pricePromotion.getAppPrice())
    } else {

    }
}

如果我们想到用策略模式,可以把vipType这个条件抽离出来,分裂出2个策略。

这里贴一下例子代码:

场景是,客户端需要不同身份状态下是取得不同策略的优惠信息。

public interface PromotionStrategy {
    void buildPromotion();
}

public class CustomerStrategy implements PromotionStrategy{
    public void buildPromotion() {

    }
}

public class VipStrategy implements PromotionStrategy{
    public void buildPromotion() {

    }
}

public class StrategyContext {

    PromotionStrategy strategy;

    public void setStrategy(PromotionStrategy strategy) {
        this.strategy = strategy;
    }

    void buildPromotion( ){
        strategy.buildPromotion();
    }
}

public class Cilent {

    public static void main(String[] args) {
       String status = args[0];

        if("customer".equals(status)){
            StrategyContext strategyContext = new StrategyContext();
            strategyContext.setStrategy(new CustomerStrategy());
            strategyContext.buildPromotion();
        }
        else if("vip".equals(status)){
            StrategyContext strategyContext = new StrategyContext();
            strategyContext.setStrategy(new VipStrategy());
            strategyContext.buildPromotion();
        }
    }
}

注意到策略模式并不是一个能够单独使用的模式,因为它暴露给客户端具体的策略。

时间: 2024-11-08 19:04:46

《重构与模式》简化-积木系列的相关文章

builder模式-积木系列

代码高效的表达意图,是优秀代码的基本标准,所以在刚刚写代码的时候我们总是被教育方法的名字,变量字段的名字要尽可能表达出在程序中的含义. 在<重构和模式>中提到的creation,就是讲构造实例的方式封装变为可以表达含义的方法提供给客户端使用,从而保证了在阅读客户端代码时,可以清洗的明白代码在做什么,而不需要进入构造方法中看创建的逻辑. 创建的模式中有工厂方法 和 builder模式.无论用什么方式,我们想达到的目的就是讲构造过程和使用过程分离. builder类图:

重构摘要9_简化条件表达式

<重构-改善既有代码的设计>Martin Fowler 摘要: 第九章 简化条件表达式 Decompose Conditinal 分解条件表达式 你有一个复杂的条件(if-then-else)语句 从三个段落中分别提炼出独立函数 Consolidate Conditional Expression 合并条件表达式 你有一系列条件测试,都得到相同结果 将这些测试合并成为一个条件表达式,并将这个条件表达式提炼成为一个独立函数 检查用意更清晰,有时也不用这么做 Consolidate Duplica

重构与模式:改善代码三部曲中的第三部

一.改善代码的三部曲 <设计模式>-> <重构>-> <重构与模式>.也就是设计->重构->重构出新设计. <设计模式>主要详细说明20几种模式,为我们带来了常见设计问题的经典解决方案,从而改变了整个面向对象开发的面貌.为设计而著. <重构>改善既有代码的设计,总结了我们会用到的各种重构手法,为我们带来了一种改进代码的高效过程,从而彻底改变了面向对象设计的方式.侧重去除坏代码的味道. <重构与模式>是设计模式相

重构摘要10_简化函数调用

<重构-改善既有代码的设计>Martin Fowler 摘要: 第十章 简化函数调用 Rename Method 函数改名 改一个自表达的名字吧!骚年 Add Parameter 添加参数 某个函数需要从调用端得到更多信息. 为此函数添加一个对象参数,让该对象代价函数所需信息.并发编程大多数参数很长,不放在一个类中,因为这样你可以保证传递给函数的参数都是不可修改的. Remove Parameter 移除参数 移除不必要的某个参数 Separate Query from Modifier 将查

Usart的单线半双工模式(stm32F10x系列)

这两天折腾CTS/RTS硬件流控,看到说232协议的CTS/RTS只是用来做半双工换向使用的.正好手头上有块stm32的板子,看了看stm32的Usart,竟然发现支持的是单线半双工.232里面毕竟4根线,支持半双工也是各自独立地物理信道(大胆猜测,回头回顾一下以前草草使用的双线485,看看它的半双工).第一次注意到.之所以引起我的兴趣,是因为,我好奇stm32的单线半双工有2点. 第一:有啥用.结果上网一搜,还真有人用它来控制AX-12数字舵机. 第二:怎么实现的.我印象中stm32的io口是

java工厂-积木系列

这里记录一个例子,工厂模式的理论就不扯淡了. 遇到的问题:支付方式有很多种,比如微信支付 支付宝支付 银联支付 等等.我们在在实现的时候发现他么的流程上是相似的,以及每个方式都有大量的个性配置,在实例化时需要加载他们,以及为了清晰的讲调用方和实现方进行分离,就有来下面的小设计. 以银联为例,(通过测试). 共用接口: public interface CommonPay { /** * <pre> * 功能描述: * 支付预处理:生成支付URL或提供给支付平台的数据 * * @param pa

重构手法之简化条件表达式【1】

返回总目录 本小节目录 Decompose Conditional(分解条件表达式) Consolidate Conditional Expression(合并条件表达式) 1Decompose Conditional(分解条件表达式) 概要 你有一个复杂的条件(if-else if-else)语句. 从if.else if.else三个段落中分别提炼出独立函数. 动机 复杂的条件逻辑往往会导致程序复杂度上升.编写代码来检查不同的条件分支.根据不同的分支做不同的事往往又会导致函数过长. 将条件表

java单例-积木系列

一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档. 懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒汉,因为它是属于延迟加载这个实例的,也就是说不用到的时候,不实例化对象的. public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInst

使用模板方法模式简化JDBC操作

在使用JDBC时,会重复的写很多重复的代码,例如 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; String sql="insert into t_user(username,brithday) values(?,?)"; try { conn = JdbcUtils.getConnection(); ps = conn.prepareStatement(sql); } catch (