java 策略模式例子_策略模式—Java实现(转)

article/2025/10/4 15:07:14

1. 现实需求

客户有了新的需求,这时我们直接新增策略即可,改很少的代码。基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合。

2. 策略模式定义

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

3. 设计原则

设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口然后在类中包  含这  个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。

策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响 到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

4. 策略模式中有三个对象:

(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。

(2) 抽象策略对象:它可由接口或抽象类来实现。

(3)  具体策略对象:它封装了实现同不功能的不同算法。

利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

5. 为了方便大家理解,还是我们以大多网络上的实例讲解。

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开能解决棘手问题,嘿,还别说,真解决了大问题,搞到最后是周瑜陪了夫人又折兵,那咱们先看看这个场景是什么样子的。

先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是亮哥给的,妙计放在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊取出妙计,执行,然后获胜。用java程序怎么表现这些呢?

类图:

7316dafe26f94da2359a05cb176da67a.png

项目结构:

7b99f18e2e58ac13a525fa421e3acfdc.png

具体代码

48304ba5e6f9fe08f3fa1abda7d326ab.png

package chengxuyuanzhilu.com.sp;

/**

* @author 微信公众号:程序员之路

* 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。

*/

public interface IStrategy {

//每个锦囊妙计都是一个可执行的算法。

public void operate();

}

package chengxuyuanzhilu.com.sp.imp;

import chengxuyuanzhilu.com.sp.IStrategy;

/**

* @author 微信公众号:程序员之路

* 找乔国老帮忙,使孙权不能杀刘备

*/

public class BackDoor implements IStrategy {

@Override

public void operate() {

System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");

}

}

package chengxuyuanzhilu.com.sp.imp;

import chengxuyuanzhilu.com.sp.IStrategy;

/**

* @author 微信公众号:程序员之路

* 孙夫人断后,挡住追兵

*/

public class BlackEnemy implements IStrategy {

@Override

public void operate() {

System.out.println("孙夫人断后,挡住追兵...");

}

}

package chengxuyuanzhilu.com.sp.imp;

import chengxuyuanzhilu.com.sp.IStrategy;

/**

* @author 微信公众号:程序员之路

* 求吴国太开个绿灯

*/

public class GivenGreenLight implements IStrategy {

@Override

public void operate() {

System.out.println("求吴国太开个绿灯,放行!");

}

}

package chengxuyuanzhilu.com.sp;

/**

* @author 微信公众号:程序员之路

* 放策略的锦囊

*/

public class Context {

//接口的好处就在于它可以指向实现了它的任意实现类

private IStrategy strategy;

//通过锦囊的构造函数,去指定具体要选择哪条策略去处理遇到的危险

public Context(IStrategy strategy) {

this.strategy = strategy;

}

public void operate(){

this.strategy.operate();

}

}

package chengxuyuanzhilu.com.sp;

import chengxuyuanzhilu.com.sp.imp.BackDoor;

import chengxuyuanzhilu.com.sp.imp.BlackEnemy;

import chengxuyuanzhilu.com.sp.imp.GivenGreenLight;

/**

* @author 微信公众号:程序员之路

* 赵云就是我们现实生活中的客户

*/

public class ZhaoYun {

/**

* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计

*/

public static void main(String[] args) {

Context context;

//刚到吴国的时候拆开第一个

System.out.println("----------刚刚到吴国的时候拆开第一个---------------");

context = new Context(new BackDoor());

context.operate();//拆开执行

System.out.println("\n");

//当刘备乐不思蜀时,拆开第二个

System.out.println("----------刘备乐不思蜀,拆第二个了---------------");

context = new Context(new GivenGreenLight());

context.operate();//拆开执行

System.out.println("\n");

//孙权的小追兵了,咋办?拆开第三个锦囊

System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");

context = new Context(new BlackEnemy());

context.operate();//拆开执行

System.out.println("\n");

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

执行结构:


http://chatgpt.dhexx.cn/article/9WymSfa7.shtml

相关文章

Java设计模式(五)策略模式-在SpringBoot项目中的实际应用

文章目录 什么是策略模式优点缺点使用场景结构图 策略模式的简单示例策略模式的项目实战场景实现 小结 什么是策略模式 官话:策略模式(Strategy Pattern): 定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换&#xff…

java调用微信加密_java微信消息加解密

今天心血来潮就信手拈来学了下微信消息加解密的知识,忽然觉得微信真的好强大。可能在大部分项目微信消息的加解密都用不上,但是仍然不排除有使用到的情况,如涉及金钱方面的微信应用包括商城类、金融类还有其他安全级别要求很高的微信应用。针对这些情况我觉得还是有必要分享…

spring如何使用策略模式

这里使用登录做例子介绍如何实现登录的多种策略 上图是策略模式的基础模型。 context Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 Strategy 策略角色…

java设计模式实战-(反射+策略模式)

学完23种设计模式,相信很多同学都疑问,除了单例模式、工厂模式其他模式还有运用的场景吗? 现在这里就举一个例子。 首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景。但是在实际的开发中&#x…

Java23种设计模式之策略模式【普通写法以及spring中的写法】

目录 设计模式简介策略模式的简介普通写法案例基于注解式改造的案例优缺点策略模式的使用场景 设计模式简介 将设计者的思维融入大家的学习和工作中,更高层次的思考! • 创建型模式: – 单例模式、工厂模式、抽象工厂模式、建造者模式、原型…

Java设计模式-策略模式(支付业务的优化)

一、什么情况下使用策略模式 功能类似的业务功能,避免创建多个接口,大量if else 判断逻辑,简化代码 二、我以支付为例(支付方式有微信,支付宝支付) 1、新建策略抽象类或者接口 public interface ThirdP…

java策略模式实战示例

现已放在gitee上,可以不下载直接参考一下即: https://gitee.com/zhang-xiao-xiang/zxx-pattern 日常碰到的业务概述 登录类型,支付类型,供应商渠道,不同等级会员享受的优惠券价格不一样,等等业务判断,大量if else导致拓展(侧重新增)极其困难,维护(侧重修改)自然是改起来头痛(…

【JAVA设计模式】策略模式

1.什么是策略模式? 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,相同的事情-----选择不用同方式 (不同实现)举例子,最终可以实现解决多重if判断问题。 …

java微信关注事件_java策略模式在接收微信事件推送上的具体应用

java策略模式,在我的认知中是根据不同选择执行不同的实现。通过if或者switch-case也能实现这种逻辑,但是代码冗余,可扩展性不强。 百度百科上的解释为策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景…

Java设计模式之3种策略模式实现

一、什么是策略模式 所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。比如我们要去某个地方,会根据距离的不同来选择不同的出行方式&…

java8 策略模式_JAVA设计模式之策略模式

策略模式:在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对…

git如何提交代码

代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前,首先应该检查目前所做的修改,运行git status命令 a)…

修改git提交时间

问题描述: 修改git提交记录的时间 git脚本: 此方法使用github上的开源工具完成。感谢无私的奉献者! 操作步骤: github上下载文件 解压文件夹,把git-redate文件置于git安装目录的\mingw64\libexec\git-core文件夹…

git提交时常用命令

git提交时常用命令 一、git命令 -- 本地仓库与远程仓库建立链接 git init (初始化本地仓库) git remote add origin 远程仓库网址 git remote -v (查看远程仓库) git remote rm origin (删除远程分支)-- checkout多种用法 git checkout 文件名 &#…

git提交分支

1. git提交分支相关 在本地新建分支,保证和远程分支一样 git checkout -b 分支名如果分支已存在,只需要切换的话 git checkout 分支名提交前先把代码拉下来更新一下,确保不会覆盖别人的代码 git pull origin 远程分支(如果有)解决冲突 git …

Git 的提交

1 提交对象 理解Git分支,就需要了解提交及在提交过程中产生的提交对象(commit object)。在进行提交时Git会存储一个提交对象,其中包含一个指针,它指向此次提交时暂存内容的快照。除此之外,提交对象中还包含…

git代码提交

代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前,首先应该检查目前所做的修改,运行git status命令 a…

【git提交】流程

1- git提交(分支合并)操作流程: git 提交代码到自己的分支,并合并到主分支的完整流程 分支 sml , 主分支, master 分支msl上操作 git status git add . git commit -m ‘xxxxxx’ git pull origin master…

git提交规范,规范自己的提交标准

为了规范我的git提交内容,提交的时候commit -m “备注的信息”,但是每个人的备注信息千奇百怪,为了统一,我们进行了git的规范。 首先要全局安装commitizen npm i -g commitizen4.2.4然后安装插件 npm i cz-customizable6.3.0…

git提交常用命令

git 安装 1.在终端,检查git是否安装 git --version 2.没有安装的话,去git官网,下载git 3.安装后,在终端,检查git是否安装 4设置用户名和邮件地址(最好和github的用户名/邮箱保持一致 git config -…