深入探索Java设计模式(二)之策略模式
抽丝剥茧 细说架构那些事——【优锐课】
策略设计模式是Java API库中常见的模式之一。这与另一个设计模式(称为状态设计模式)非常相似。本文是在学习完优锐课JAVA架构VIP课程—【框架源码专题】中《学习源码中的优秀设计模式》后写下的学习感悟。简要介绍了该思想,并提供了有关如何在Java中实现该思想的示例。
总览
策略模式也称为策略模式。它被归类为行为软件设计模式,其中重点是在对象之间找到灵活的通信模式。它有助于在运行时对象之间建立灵活的通信。
策略模式
策略模式的基本思想是在类的较小层次扩展中组合一组操作。与该策略相关的对象确定在给定情况下将使用哪种算法。例如,它使我们能够在运行时交换算法的实现细节,而无需我们重写它。这个想法与依赖注入中的实现模式产生了共鸣,因为它还允许在测试过程中将实现换出,例如在测试代码中执行模拟实现。
从状态设计模式的角度来看,它类似于状态设计模式,它是封装上下文对象状态的对象。策略设计模式中的对象类似地封装了算法的实现,并且可以根据需要在运行时交换事件。
在Java API库中,java.awt.Container组件是使用此模式的示例。此处,LayoutManager充当策略对象。这些类(例如BorderLayout,FlowLayout和GridLayout)实现接口LayoutManager。实现的类定义一个名为addLayoutComponent()的方法。此方法内的定义确定逻辑,或如何将组件布置在Container对象中。例如,FlowLayout从左到右放置它们,而BorderLayout将它们放置在名为CENTER,NORTH,EAST,SOUTH,WEST的区域中。 Container类包含称为LayoutManager对象的策略对象。因为该接口包含对实现该接口的类的对象的引用,所以策略对象可以随时引用已实现的类。
策略模式的使用
它基本上是从通用基类继承的类的集合。它具有相同的基本结构和通用功能,但区别在于使用方式。可以说,它按照所应用的策略起作用。策略模式通过提供运行时灵活性来增强你的能力。与其他类似的模式(例如状态和命令)不同,可以通过创建代理类来利用这种灵活性,该代理类在运行时控制特定策略的选择。
实现策略模式
这是此模式的快速实现。这个想法很简单,但是可以有效地选择所需的实现并根据需要进行交换。没什么好想的,类的接口和层次结构创建了演绎,这是在代码中使用的一种策略。
在这里,它使我们能够使用Sort接口编写代码,而我们想要排序的代码不必关心用于排序的算法。通过对接口和适合特定实现的类结构进行编程,我们可以根据需要使用接口,并在需要其他接口时立即更改策略。从某种意义上说,这个想法是可扩展的,在以后,我们可以添加更多的实现。针对该接口编写的任何代码都不会更改,但可以使用新的实现。
package org.mano.example;
public interface Sort {
int [] sort(int[] nos);
}
package org.mano.example;
public class BubbleSort implements Sort{
@Override
public int [] sort(int[] nos) {
System.out.println("\n--- BUBBLE SORT strategy
in action---\n");
int n = nos.length;
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (nos[j] > nos[j+1])
{
int tmp = nos[j];
nos[j] = nos[j+1];
nos[j+1] = tmp;
}
return nos;
}
}
package org.mano.example;
public class SelectionSort implements Sort{
@Override
public int [] sort(int [] nos) {
System.out.println("\n--- SELECTION SORT strategy
in action ---\n");
int n = nos.length;
for (int i = 0; i < n-1; i++)
{
int mindex = i;
for (int j = i+1; j < n; j++)
if (nos[j] < nos[mindex])
mindex = j;
int temp = nos[mindex];
nos[mindex] = nos[i];
nos[i] = temp;
}
return nos;
}
}
package org.mano.example;
public class ShellSort implements Sort {
@Override
public int [] sort(int[] nos) {
System.out.println("\n--- SHELL SORT strategy
in action ---\n");
int n = nos.length;
for (int part = n/2; part > 0; part /= 2)
{
for (int i = part; i < n; i += 1)
{
int temp = nos[i];
int j;
for (j = i; j >= part && nos[j - part] >
temp; j -= part) nos[j] = nos[j - part];
nos[j] = temp;
}
}
return nos;
}
}
package org.mano.example;
import java.util.Random;
public class SortingApp {
private Sort sortStrategy;
public SortingApp(Sort sort){
this.sortStrategy = sort;
}
public int [] sort(int[] data){
return sortStrategy.sort(data);
}
public void changeStrategy(Sort anotherStrategy){
sortStrategy = anotherStrategy;
}
public void printArray(int arr[])
{
int n = arr.length;
for (int i=0; i<n; ++i)
System.out.print(arr[i]+" ");
System.out.println();
}
public static int [] getDummyData(){
Random r = new Random();
int [] data = new int [10];
for (int i=0;i<10;i++)
data[i] = r.nextInt(100);
return data;
}
public static void main(String[] args){
SortingApp app = new SortingApp(new BubbleSort());
app.printArray(app.sort(getDummyData()));
app.changeStrategy(new SelectionSort());
app.printArray(app.sort(getDummyData()));
app.changeStrategy(new ShellSort());
app.printArray(app.sort(getDummyData()));
}
}
输出
--- BUBBLE SORT strategy in action--- 5 15 22 38 41 45 56 72 72 97 --- SELECTION SORT strategy in action --- 42 47 52 55 60 76 79 82 86 96 --- SHELL SORT strategy in action --- 11 13 19 24 27 33 47 72 72 88
结论
策略模式使我们能够将有关要使用的实施策略的决策推迟到运行时为止。当我们使用Spring Framework将XML用作配置文件来构造对象及其依赖项时,将在运行时读取它。这种模式的主要优点是它利用了实现之间的动态变化,而无需重新编译。
感谢阅读!欢迎留言。想更深入探讨学习也欢迎私信我。下篇继续~

深入探索Java设计模式(二)之策略模式的更多相关文章
- 深入探索Java设计模式之构建器模式(五)
抽丝剥茧 细说架构那些事——[优锐课] 简单的程序不需要大量的设计过程,因为它们只关注有限的解决方案,仅使用几个类.大型程序专注于广泛的设计,该设计比好的设计范例的任何其他属性都更能利用可重用性.宏伟 ...
- Java设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- 《JAVA设计模式》之策略模式(Strategy)
在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它 ...
- Java设计模式6:策略模式
策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...
- JAVA设计模式之【策略模式】
策略模式 定义一些独立的类来封装不同的算法 类似于common方法或者引用类 角色 环境类Context 抽象策略Strategy 具体策略ConcreteStrategy 重构伴随着设计模式 重构类 ...
- Java设计模式系列之策略模式
策略模式的定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化. 策略模式使这些算法在客户端调用它们的时候能够互不影响地变化 ...
- Java设计模式学习记录-策略模式
策略模式 策略模式的定义是:定义了一系列的算法,把它们一个个的封装起来,并且使它们可相互替换,让算法可以独立于使用它的客户而变化. 设计原则是:把一个类中经常改变或者将来可能会经常改变的部分提取出来作 ...
- java设计模式-----8、策略模式
Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略).S ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 文无第一,武无第二 不同方向但同样努力的人,都有自身的价值和亮 ...
随机推荐
- 深度剖析Javascript执行环境、作用域链
一.执行环境 执行环境(也叫做执行上下文,Execution Context)是Javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问其他数据,决定了它们各自的行为.每个执行环境都 ...
- MySQL索引长度限制
索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎 ...
- UDP 协议的那点事儿
最近在回顾计算机网络的知识,以前上课没有认真学,只记得几个高大上的术语,所以趁着这次回顾,把学到的知识用博客的形式记录下来,一来加深自己的印象,二来希望让你对这些基础知识有一个更深入的了解.当然,我会 ...
- Android View 的添加绘制流程 (二)
概述 上一篇 Android DecorView 与 Activity 绑定原理分析 分析了在调用 setContentView 之后,DecorView 是如何与 activity 关联在一起的,最 ...
- Docker从门外到入门使用
取材 第一本Docker书.原作者:James Turnbull 安装 这里只说明Windows环境的安装(Windows7以上) 使用Docker Toolbox工具即可:http://mirror ...
- Dockerfile构建私有镜像
构建第一个镜像 镜像的定制实际上就是定制每一层所添加的配置,文件.我们可以把每一层修改,安装,构建,操作的命令都写入一个脚本,这个脚本就是Dockerfile.Dockerfile是一个文本文件,其内 ...
- 2、Docker 基础安装和基础使用 一
基础环境 本次环境使用Centos 7.x版本系统,最小化安装,系统基础优化配置请查看 Centos 7.x 系统基础优化 安装 使用命令:yum install docker-io -y [root ...
- react中将svg做成icon组件在其他模块调用
开发前端页面,经常会有很多共用的图标icon,那么我们把它单独做成组件,以便后期重复调用! 首先在components 的icons文件夹下创建BaseIcon.js文件. 我们需要先在命令行安装gl ...
- c堆排序
#include<stdio.h> #include<stdlib.h> /* p是循环输出的下表*/ ; /*堆调整算法*/ /* r[]数组 , 根结点的编号为k,最后一个 ...
- 关于servlet报错和jsp中报关于servlet的错误
servlet-api是对servlet的支持,如果你导入别人的项目后出现servlet中的导包处出现关于javax.servlet.的错误,那么就是缺少这个包了.还有对jsp页面中的报错的支持. 下 ...