admin管理员组

文章数量:1130349

目录

1 策略模式(Strategy)

2 抽象Strategy类

3 具体Strategy类

3.1 加法Strategy类

3.2 减法Strategy类

3.3 乘法Strategy类

3.4 除法Strategy类

4 调试代码

5 调试结果

 注:


1 策略模式(Strategy)

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

2 抽象Strategy类

package com.xudongbase.designpattern.strategy;

import java.math.BigDecimal;

/**
 * Strategy 模式抽象Strategy类
 *
 * @author xudongmaster
 */
public interface Strategy {
    /**
     * 计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception;
}

3 具体Strategy类

3.1 加法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 加法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("add")
public class AddStrategy implements Strategy {
    /**
     * 加法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null) {
            throw new Exception();
        }
        return num1.add(num2);
    }
}

3.2 减法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 减法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("subtract")
public class SubtractStrategy implements Strategy {
    /**
     * 减法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null) {
            throw new Exception();
        }
        return num1.subtract(num2);
    }
}

3.3 乘法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 乘法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("multiply")
public class MultiplyStrategy implements Strategy {
    /**
     * 乘法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null) {
            throw new Exception();
        }
        return num1.multiply(num2);
    }
}

3.4 除法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 除法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("divide")
public class DivideStrategy implements Strategy {
    /**
     * 除法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null || num2.equals(BigDecimal.ZERO)) {
            throw new Exception();
        }
        return num1.divide(num2, 13, BigDecimal.ROUND_HALF_DOWN);
    }
}

4 调试代码

package com.xudongbase.designpattern;

import com.xudongbase.designpattern.strategy.Strategy;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.math.BigDecimal;
import java.util.Map;

@SpringBootTest
public class StrategyTest {
    @Autowired
    private Map<String, Strategy> strategyMap;

    /**
     * 测试策略模式
     *
     * @throws Exception
     */
    @Test
    public void testStrategy() throws Exception {
        //加法策略模式
        System.out.println(strategyMap.get("add").operation(new BigDecimal(2), new BigDecimal(4)));
        //减法策略模式
        System.out.println(strategyMap.get("subtract").operation(new BigDecimal(2), new BigDecimal(4)));
        //乘法策略模式
        System.out.println(strategyMap.get("multiply").operation(new BigDecimal(2), new BigDecimal(4)));
        //除法策略模式
        System.out.println(strategyMap.get("divide").operation(new BigDecimal(2), new BigDecimal(4)));
    }

}

5 调试结果

 注:

         需要查看源码请前往Gitee的xudongbase项目design_pattern分支。

xudongbase: 主要是项目中可以用到的共通方法 - Giteehttps://gitee/xudong_master/xudongbase/tree/design_pattern/

目录

1 策略模式(Strategy)

2 抽象Strategy类

3 具体Strategy类

3.1 加法Strategy类

3.2 减法Strategy类

3.3 乘法Strategy类

3.4 除法Strategy类

4 调试代码

5 调试结果

 注:


1 策略模式(Strategy)

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

2 抽象Strategy类

package com.xudongbase.designpattern.strategy;

import java.math.BigDecimal;

/**
 * Strategy 模式抽象Strategy类
 *
 * @author xudongmaster
 */
public interface Strategy {
    /**
     * 计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception;
}

3 具体Strategy类

3.1 加法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 加法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("add")
public class AddStrategy implements Strategy {
    /**
     * 加法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null) {
            throw new Exception();
        }
        return num1.add(num2);
    }
}

3.2 减法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 减法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("subtract")
public class SubtractStrategy implements Strategy {
    /**
     * 减法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null) {
            throw new Exception();
        }
        return num1.subtract(num2);
    }
}

3.3 乘法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 乘法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("multiply")
public class MultiplyStrategy implements Strategy {
    /**
     * 乘法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null) {
            throw new Exception();
        }
        return num1.multiply(num2);
    }
}

3.4 除法Strategy类

package com.xudongbase.designpattern.strategy;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 除法Strategy类(Strategy 模式具体Strategy类)
 *
 * @author xudongmaster
 */
@Component("divide")
public class DivideStrategy implements Strategy {
    /**
     * 除法计算
     *
     * @param num1
     * @param num2
     * @return
     * @throws Exception
     */
    @Override
    public BigDecimal operation(BigDecimal num1, BigDecimal num2) throws Exception {
        if (num1 == null || num2 == null || num2.equals(BigDecimal.ZERO)) {
            throw new Exception();
        }
        return num1.divide(num2, 13, BigDecimal.ROUND_HALF_DOWN);
    }
}

4 调试代码

package com.xudongbase.designpattern;

import com.xudongbase.designpattern.strategy.Strategy;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.math.BigDecimal;
import java.util.Map;

@SpringBootTest
public class StrategyTest {
    @Autowired
    private Map<String, Strategy> strategyMap;

    /**
     * 测试策略模式
     *
     * @throws Exception
     */
    @Test
    public void testStrategy() throws Exception {
        //加法策略模式
        System.out.println(strategyMap.get("add").operation(new BigDecimal(2), new BigDecimal(4)));
        //减法策略模式
        System.out.println(strategyMap.get("subtract").operation(new BigDecimal(2), new BigDecimal(4)));
        //乘法策略模式
        System.out.println(strategyMap.get("multiply").operation(new BigDecimal(2), new BigDecimal(4)));
        //除法策略模式
        System.out.println(strategyMap.get("divide").operation(new BigDecimal(2), new BigDecimal(4)));
    }

}

5 调试结果

 注:

         需要查看源码请前往Gitee的xudongbase项目design_pattern分支。

xudongbase: 主要是项目中可以用到的共通方法 - Giteehttps://gitee/xudong_master/xudongbase/tree/design_pattern/

本文标签: 模式策略Strategy