107-*策略模式在Thread和Runnable中的应用分析
Runnable接口与多线程中的哪种设计模式比较接近?
- 策略模式
举例:税收计算器。需多看代码示例,深入理解策略模式。
税收计算器接口。策略模式
@FunctionalInterface public interface CalculatorStrategy { /** * 计算税率 * * @param salary 薪水 * @param bonus 奖金 * @return 税收 */ double calculate(double salary, double bonus); }
税收计算器实现类
public class SimpleCalculatorStrategy implements CalculatorStrategy { private final static double SALARY_RATE = 0.1; private final static double BONUS_RATE = 0.15; // 计算税率:工资*0.1 + 奖金*0.15 @Override public double calculate(double salary, double bonus) { return salary * SALARY_RATE + bonus * BONUS_RATE; } }
税务计算器。Runnable与多线程设计模式
@Data public class TaxCalculator { // 薪水 private final double salary; // 奖金 private final double bonus; private CalculatorStrategy calculatorStrategy; public TaxCalculator(double salary, double bonus) { this.salary = salary; this.bonus = bonus; } public TaxCalculator(double salary, double bonus, CalculatorStrategy calculatorStrategy) { this.salary = salary; this.bonus = bonus; this.calculatorStrategy = calculatorStrategy; } // 计算税率 protected double calcTax() { return calculatorStrategy.calculate(salary, bonus); } // 计算 public double calculate() { return this.calcTax(); } }
税务计算器测试类
public class TaxCalculatorMain { // 1. 模版方法 @Test public void test1() { TaxCalculator calculator = new TaxCalculator(10000d, 2000d) { @Override protected double calcTax() { return getSalary() * 0.1 + getBonus() * 0.15; } }; System.out.println(calculator.calculate()); } // 2.1 策略模式 @Test public void test2() { TaxCalculator calculator = new TaxCalculator(10000d, 2000d); CalculatorStrategy strategy = new SimpleCalculatorStrategy(); calculator.setCalculatorStrategy(strategy); System.out.println(calculator.calculate()); } // 2.2 策略模式-Java8Lambda-1 @Test public void test3() { TaxCalculator calculator = new TaxCalculator(10000d, 2000d); calculator.setCalculatorStrategy((s, b) -> s * 0.1 + b * 0.15); System.out.println(calculator.calculate()); } // 2.2 策略模式-Java8Lambda-2 @Test public void test4() { TaxCalculator calculator = new TaxCalculator(10000d, 2000d, (s, b) -> s * 0.1 + b * 0.15); System.out.println(calculator.calculate()); } }
通过策略模式的思想改造BankRunnable.java
银行大厅
public class BankRunnable { private final static int MAX = 50; private int index = 1; public static void main(String[] args) { // 1. 一个runnable实例被多个线程共享 /*TicketWindowRunnable ticketWindow = new TicketWindowRunnable();*/ // 2. 策略模式思想改造runnable实例线程 Runnable ticketWindow = new BankRunnable().getTicketWindow(); Thread windowThread1 = new Thread(ticketWindow, "一号窗口"); Thread windowThread2 = new Thread(ticketWindow, "二号窗口"); Thread windowThread3 = new Thread(ticketWindow, "三号窗口"); windowThread1.start(); windowThread2.start(); windowThread3.start(); } private Runnable getTicketWindow() { return () -> { while (index <= MAX) { System.out.println(Thread.currentThread() + " 的号码是:" + (index++)); Thread.sleep(100); } }; } }
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:107-*策略模式在Thread和Runnable中的应用分析
文章字数:486
本文作者:神秘的小岛岛
发布时间:2019-11-12, 10:51:03
最后更新:2019-12-24, 11:57:28
原始链接:https://www.tuyrk.cn/wang-thread/107-Strategy-in-thread/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。