107-*策略模式在Thread和Runnable中的应用分析

Runnable接口与多线程中的哪种设计模式比较接近?

  • 策略模式

举例:税收计算器。需多看代码示例,深入理解策略模式。

  1. 税收计算器接口。策略模式

    @FunctionalInterface
    public interface CalculatorStrategy {
        /**
         * 计算税率
         *
         * @param salary 薪水
         * @param bonus 奖金
         * @return 税收
         */
        double calculate(double salary, double bonus);
    }
  2. 税收计算器实现类

    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;
        }
    }
  3. 税务计算器。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();
        }
    }
  4. 税务计算器测试类

    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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏