多线程之策略模式

今天天气非常好,下着淅淅沥沥的小雨,刮着风,感觉甚好;我在北京向各位问好。这几天公司基本没什么事儿,从昨天开始就复习了一下多线程编程,今天给各位分享一种Java23种设计模式中最常见的设计模式--策略模式。为什么将策略模式和多线程绑在一起呢,不知道各位有没有注意过我们在进行多线程编程的时候,创建线程的方式有2种,一种是继承Thread类,另外一种就是实现Runnable接口;当然,我们会毫不保留的选择第二种,因为扩展性强,习惯接口开发等等原因,但是第二种方式还潜藏了23种Java设计模式中的其中一个模式,那就是低调而又强势的"策略模式"。

说说策略模式吧,这种模式的设计思想就是:为了考虑业务逻辑的千变万化和复杂程度是不一定的,因此我们需要对这套程序进行高度的抽象,这样才能将业务逻辑和抽象进行相分离,才能够让这套程序的可扩展性变的极强,这也是在开发中会使用策略模式的强大之处。好了读到这儿,我相信从来没有接触过这种设计模式的读者来说,还是一头雾水,接下来我就开始通过多线程来请出我们的"策略模式"。

先看代码再解释:

 1 public static void main(String[] args) {
 2         //创建线程一:
 3         new Thread(new Runnable() {
 4             @Override
 5             public void run() {
 6                 int i=100;
 7                 while(i>0){
 8                     System.out.println("创建的线程一:"+i--);
 9                 }
10             }
11         }).start();
12         //创建线程二:
13         new Thread(new Runnable() {
14             @Override
15             public void run() {
16                 int i=100;
17                 while(i>50){
18                     System.out.println("创建的线程二:"+i--);
19                 }
20             }
21         }).start();
22         //主线程:
23         int i=0;
24         while(i<100){
25             System.out.println("主线程:"+i++);
26         }
27
28     }

上面这段代码是一个最简单的多线程案例,这段程序总共由3个线程来同时执行(当然除此之外还有Java虚拟机的垃圾回收等等其他一些线程),并交错打印变量的值。在这儿我们先暂时停一下,我想反问各位一个问题,为什么我们重写的是Runnable接口的run()方法,但是开启线程的却是start()方法?没错,正是"策略模式"在操控,什么?还有这种操作。哈哈哈,我当时学习这种设计模式的时候也是各种奇怪,各种撞墙,不过还好我通过了一个实例至少简单明白了它是如何操控的。

下面我就通过一个实例让各位读者切身体会一下策略模式的好处和强大。需求:设计一个随心所欲的算法器

第一步:只需设计一个算法接口即可,主要是因为规范或者让程序知道如何进行调用。

1 /**
2  * 算法接口
3  * @author zxz
4  *
5  */
6 interface CalculatorInterface{
7     int calc(int x,int y);
8 }

第二步:就是整个程序的结构,也就是算法器的高度抽象部分,里面约束了整个程序的框架和大概流程,但是最重要的是并未涉及到业务层面的东西,因为我这个需求是设计一个算法器,肯定是有数据流入流出的,那么它就是将数据的流入流出做了规范,只是提供了一个默认的逻辑实现。

 1 /**
 2  * 算法器
 3  */
 4 class Calculator{
 5     private int x=0;
 6     private int y=0;
 7     private CalculatorInterface calculatorInterface = null;
 8
 9     public Calculator(int x, int y) {
10         this.x = x;
11         this.y = y;
12     }
13
14     public Calculator(int x, int y,CalculatorInterface calculatorInterface) {
15         this(x,y);
16         this.calculatorInterface = calculatorInterface;
17     }
18
19     public int calc(int x,int y){
20         return x+y;
21     }
22     //只需关注接口,并且将接口用到的参数传递进去即可,不必担心具体的业务是如何封装的【这段代码请各位好好斟酌】
23     public int result(){
24         if(null!=calculatorInterface){
25             return calculatorInterface.calc(x, y);
26         }
27         return calc(x, y);
28     }
29 }

第三步:额外定义加法和减法算法类,为了下面的测试使用。

 1 /**
 2  * 加法算法
 3  */
 4 class AddStrategy implements CalculatorInterface{
 5     @Override
 6     public int calc(int x, int y) {
 7         return x+y;
 8     }
 9 }
10 /**
11  * 减法算法
12  */
13 class SubStrategy implements CalculatorInterface{
14     @Override
15     public int calc(int x, int y) {
16         return x-y;
17     }
18 }

第四步:我们开始测试,看看现象应该就能明白策略模式是如何低调的。

 1 /**
 2  * 主程序
 3  */
 4 public class Strategy {
 5
 6     public static void main(String[] args) {
 7         //没有任何策略时的结果
 8         Calculator c = new Calculator(33, 3);
 9         System.out.println(c.result());
10
11         //传入减法策略的结果
12         Calculator c1 = new Calculator(33, 3,new SubStrategy());
13         System.out.println(c1.result());
14
15         //【是时候展示真正的技术了】策略模式的强大,在这里算法可以随意设置,只要你使用接口方式创建对象
16         int result = new Calculator(33, 3,new CalculatorInterface() {
17             @Override
18             public int calc(int x, int y) {
19                 return (x+y)/2;
20             }
21         }).result();
22         System.out.println(result);
23     }
24
25 }

 最后,策略设计模式的实现过程算是完成了,主要就是这套代码,需要各位自己斟酌,如有不对的地方留言指正,共勉。

时间: 2024-11-07 14:42:53

多线程之策略模式的相关文章

策略模式的孪生兄弟——对状态模式的深度复习总结

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 和策略模式的比较 状态模式概念和例子 应用场景 责任链模式和状态模式对比 一种代码优化的思路 java.util.Iterator里也有状态模式的影子 状态模式的优缺点 有限状态机及其应用 前面有总结——策略模式,之前早就觉得策略和状态设计模式有一些相似…… 接口的常用用法都有什么?策略设计模式复习总结 我知道策略模式是对象的行为模式,其实就是对一系列级别平等的算法的封装,它不关心算法实现,让客户端去动态的

策略模式+简单工厂模式+单例模式:简单推送服务

一.功能: 实现  获取数据  —>根据用户订阅清单进行推送 —> 这里的推送方式:QQ.Email.App.插件等等 用户可多选推送方式. 二.实现 1.推送方式—枚举(位运算): [Flags] public enum PushType { QQ = 0, Email = 2 } 2.策略模式:抽象推送策略 public interface IPush { bool Push(object data); } 3.QQ推送+Email推送 QQ推送:单例模式—静态创建QQ推送服务,线程安全.

策略模式+单例模式+简单工厂模式:推送服务

一.功能: 实现  获取数据  —>根据用户订阅清单进行推送 —> 这里的推送方式:QQ.Email.App.插件等等 用户可多选推送方式. 二.实现 1.推送方式—枚举(位运算): [Flags] public enum PushType { QQ = 0, Email = 2 } 2.策略模式:抽象推送策略 public interface IPush { bool Push(object data); } 3.QQ推送+Email推送 QQ推送:单例模式—静态创建QQ推送服务,线程安全.

深入解析策略模式

在讲策略模式之前,我们先看一个日常生活中的小例子: 现实生活中我们到商场买东西的时候,卖场往往根据不同的客户制定不同的报价策略,比如针对新客户不打折扣,针对老客户打9折,针对VIP客户打8折... 现在我们要做一个报价管理的模块,简要点就是要针对不同的客户,提供不同的折扣报价. 如果是有你来做,你会怎么做? 我们很有可能写出下面的代码: package strategy.examp02; import java.math.BigDecimal; public class QuoteManager

策略模式的具体应用

1.业务场景 随着信息化水平逐渐提升,业务部门在数据可视化方面提报了新的需求,上位机软件在扫描枪扫描投入料时,需要将物料的详细发送到对应的LED屏幕上. 2.初步设计 一开始,只有一个工厂提出这个需求,直接在扫描投入料的代码的后面,增加了调用LED的委托方法(通过委托方式实现线程级别的发送,从未不影响正常业务).满足需求后,向LED发送数据的业务场景越来越多,比如,切换计划.减料.扫描工位.扫描投入料.这几种场景下可能会导致LED发送方法的同时调用,造成多线程同时出发LED自带的DLL方法的调用

如何优雅的用策略模式,取代臃肿的 if-else 嵌套,看这篇就够了

经常听同事抱怨,订单来源又加了一种,代码又要加一层if-else判断,光判断订单来源的if-else就好几百行代码,代码我都不想看了,相信很多同行都有过这样的感受! Java的二十几种设计模式背的滚瓜烂熟,为什么这个时候不想着尝试用一下?说不定能轻松的解决掉哦 先说一下具体的需求: 公司推广入口很多,每一个下单来源在下单时都做特殊的逻辑处理,可能每两天就会加一个来源 一.传统的实现方式 那么按照传统的实现方式代码就是如下: public class OrderServiceImpl implem

PHP设计模式-策略模式

<?php//策略模式//将一组特定的算法或行为 封装成一个类,以适应上下文环境 //策略的接口文件 约定策略的行为 针对一种情况 产生具体的策略interface Policy{ function showAd();} class Female implements Policy{ public function showAd() { echo __CLASS__.' policy'; }} class Male implements Policy{ public function showA

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

Java 策略模式

Java 策略模式 @author ixenos 定义 1.封装算法:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换 2.分割行为和环境:对用户屏蔽内部实现,使客户端在调用算法的时候能够互不影响地互换 策略模式的实现(面向接口编程) 方法: 1.接口多态:策略模式的用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使他们之间可以相互替换 2.具体策略提供不同算法,环境负责维持和查询策略,把具体策略和环境分割开来,使得算法可以在不影响客户端和环境的情况下修改 角色分工: