如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)

如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)



描述性文字

本节讲解的是行为型设计模式中的第一个模式: 策略模式

这个模式非常简单,也很好理解。

定义一系列的算法,把每个算法封装起来,并使得他们可以相互替换

让算法独立于使用它的客户而变化

一般用来替换if-else,个人感觉是面向过程与面向对象思想的

过渡,这里举个简易计算器的栗子,帮助理解~


普通的if-else/switch计算器

普通的面向过程if-else简易计算器代码如下:

运行结果如下:

这里我们也可以改成switch,代码显得简洁一些,但也是换汤不换药


策略模式实现简易计算器

其实就是把if-else涉及到的算法,策略行为抽取出来,统一的接口,

然后各自实现,比如这里我们把抽取计算的接口,然后继承分别实现

加减乘除:

编写上下文对象负责与具体的策略类交互

客户端调用

输出结果

好了,这就是最简单的策略模式的栗子了,面向对象的if-else到

面向过程的策略模式,算法可以独立于使用它的用户而变化,比如

这里我们加多一个求余也非常简单。


概念相关

定义

定义一系列算法,将每一个算法封装起来,并让它们可以相互替换;

策略模式让算法独立于使用它的客户而变化

三个角色

  • Context: 上下文环境类,持有抽象策略角色的引用
  • Strategy: 抽象策略类,定义一系列抽象的算法策略
  • ConcreteStrategy: 具体策略类,实现具体的算法策略

UML类图

应用场景

  • 1.一个系统需要动态地在几种算法中选择一种的情况
  • 2.系统里面有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态

    地让一个对象在许多行为中选择一种行为

  • 3.一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重条件

    选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,

    就可以避免使用难以维护的多重条件选择语句。

  • 4.不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法

    与相关的数据结构,可以提高算法的保密性与安全性。

优缺点

优点:

  • 定义一系列算法实现,实现让这些算法可相互替换
  • 避免多重条件语句
  • 更好的扩展性

缺点:

  • 调用者必须了解每种策略的不同,自行选择使用哪个策略
  • 增加了对象数目,可使用享元模式在一定程度上减少对象数量
  • 只适合扁平的算法结构,在一个策略接口下,运行时只有一个算法被使用,

    这样就限制了算法的使用层级,使用时不能嵌套调用



本节代码

https://github.com/coder-pig/DesignPatternsExample/tree/master/13.Strategy%20Pattern


时间: 2024-10-10 12:57:45

如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)的相关文章

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

二十四种设计模式:策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. MessageModel using System; using System.Collections.Generic; using System.Text; na

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

JAVA设计模式之策略模式 - Strategy

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 介绍 什么是策略模式(Strategy Pattern) 在软件开发过程中常常遇到这样的情况, 实现某一个功能有很多种算法或实现策略, 我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能. 如果将这些算法或者策略抽象

策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 抛开晦涩的定义,首先看一个例子: 我们想要创建一个模拟鸭子的游戏,在这个游戏中,会有各种类型的鸭子,比如mallard duck,red head duck,rubber duck(除了rubber duck(橡皮鸭),看见这其余两种鸭子很好奇,于是查找相关图片,发现mallard duck是绿头鸭,red head duck是红头鸭,自己生活中还没有见过,有趣,哈哈!三种鸭子图片如下所示). 回归话题,在这个模拟鸭子的游戏中,各种鸭子均有两种能力,

设计模式---策略模式Strategy Pattern

策略模式 定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 问题:有一个鸭子类定义了鸭子的种种行为,包括swim(),quack(),fly(),但是,并不是所有的鸭子都会飞行(fly)或者叫(quack),在这里,我们认为所有的鸭子都会浮在水面上(swim).如何实现各种不同的鸭子的不同的表现. 解决方法:第一个想到的会使继承,在鸭子父类中定义好所有的方法,在实现鸭子子类的过程中,对不满足于具体的鸭子的行为进行覆盖,但是在这种方法

java学习笔记-设计模式14(策略模式)

意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可. public interface ICalculator { public int calculate(String exp); } public abstract class AbstractCalculator { public int[] split(String exp,String opt){ String