抽丝剥茧 细说架构那些事——【优锐课】

策略设计模式是Java API库中常见的模式之一。这与另一个设计模式(称为状态设计模式)非常相似。本文是在学习完优锐课JAVA架构VIP课程—【框架源码专题】中《学习源码中的优秀设计模式》后写下的学习感悟。简要介绍了该思想,并提供了有关如何在Java中实现该思想的示例。

深入探索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设计模式(五)之构建器模式

深入探索Java设计模式(二)之策略模式的更多相关文章

  1. 深入探索Java设计模式之构建器模式(五)

    抽丝剥茧 细说架构那些事——[优锐课] 简单的程序不需要大量的设计过程,因为它们只关注有限的解决方案,仅使用几个类.大型程序专注于广泛的设计,该设计比好的设计范例的任何其他属性都更能利用可重用性.宏伟 ...

  2. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  3. 《JAVA设计模式》之策略模式(Strategy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它 ...

  4. Java设计模式6:策略模式

    策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...

  5. JAVA设计模式之【策略模式】

    策略模式 定义一些独立的类来封装不同的算法 类似于common方法或者引用类 角色 环境类Context 抽象策略Strategy 具体策略ConcreteStrategy 重构伴随着设计模式 重构类 ...

  6. Java设计模式系列之策略模式

    策略模式的定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化. 策略模式使这些算法在客户端调用它们的时候能够互不影响地变化 ...

  7. Java设计模式学习记录-策略模式

    策略模式 策略模式的定义是:定义了一系列的算法,把它们一个个的封装起来,并且使它们可相互替换,让算法可以独立于使用它的客户而变化. 设计原则是:把一个类中经常改变或者将来可能会经常改变的部分提取出来作 ...

  8. java设计模式-----8、策略模式

    Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略).S ...

  9. java设计模式(二)---工厂方法模式

    2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...

  10. 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 文无第一,武无第二 不同方向但同样努力的人,都有自身的价值和亮 ...

随机推荐

  1. Linq 三表 left join 的实现

    目的实现: select id,name,jname,cname from userinfo u left join job j on u.job=j.jid left join city c on ...

  2. 关键路径法(Critical Path Method, CPM)

    1.活动节点描述及计算公式 通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析. 产生目的:为了解决,在庞大而复杂的项目中,如何合理而有效地组织人力.物力和财力,使之在有限资源 ...

  3. 带你涨姿势的认识一下 Kafka 消费者

    之前我们介绍过了 Kafka 整体架构,Kafka 生产者,Kafka 生产的消息最终流向哪里呢?当然是需要消费了,要不只产生一系列数据没有任何作用啊,如果把 Kafka 比作餐厅的话,那么生产者就是 ...

  4. JavaScript基础目录

    一.JavaScript简介 1.JavaScript用途 2.JavaScript的诞生 3.JavaScript从丑小鸭到金凤凰 4.JavaScript非常好学 5.学习方法 二.Hello W ...

  5. 图解 Spring:HTTP 请求的处理流程与机制【3】

    3. HTTP 请求在 Web 应用中的处理流程 在穿越了 Web 容器之后,HTTP 请求将被投送到 Web 应用,我们继续以 Tomcat 为例剖析后续流程.Web 容器与 Web 应用的衔接是通 ...

  6. 2sql

    ------------------------------------ 高级查询-- as 起别名select name as 名字 from studnets;-- 消除重复的行 -- 查看有哪几 ...

  7. 【Android - 自定义View】之View的事件分发机制

    参考资料: View事件分发:http://blog.csdn.net/pi9nc/article/details/9281829 ViewGroup事件分发:http://blog.csdn.net ...

  8. [ch04-03] 用神经网络解决线性回归问题

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 4.3 神经网络法 在梯度下降法中,我们简单讲述了一下神 ...

  9. Chapter 07-Basic statistics(Part2 Frequency and contingency tables)

    这一部分使用在vcd包中的Arthritis数据集. > library(vcd) 载入需要的程辑包:MASS 载入需要的程辑包:grid 载入需要的程辑包:colorspace > he ...

  10. python中字典数据类型常用操作

    创建字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: ...