网站首页 > java教程 正文
定义:
该模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的用户。
策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现方式分割开来,并委派给不同的对象对这些算法进行管理。
通俗理解:
在现实生活中经常遇到某种目标存在多种策略可供选择的情况。
例如:出行可以选择乘坐火车、汽车、私家车、自行车等。
优点:
1、多重条件语句不易维护,使用策略模式可以避免使用多重条件语句,如if...else 语句、switch...case语句。
2、使用恰当的继承,可以把公共代码转移到父类里面,避免重复代码。
3、策略模式可以提供相同的行为不同的实现,客户可以根据不同时间或空间要求选择不同的。
4、策略模式完美支持开闭原则,可以在不修改原代码的情况下,灵活增加算法。
5、策略模式实现了对算法的使用和实现,二者分离。
缺点:
1、使用者必须了解所有算法的区别,以便选择恰当的算法类。
2、会造成很多策略类,增加维护难度。
策略模式结构:
1、抽象策略类:定义一个公共接口,各种不同算法以不同的方式实现这个接口,环境角色使用这个接口调用不同算法,一般使用接口或者抽象类实现。
2、具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。
3、环境类: 持有一个策略类的引用,最终给客户端调用。
代码实现场景:
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜。
上代码:
/**
* 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
*/
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法
public void operate();
}
/**
* 妙计有了,需要把妙计放到锦囊里面
*/
public class Context {
// 构造函数,你要使用那个妙计
private IStrategy iStrategy;
public Context(IStrategy iStrategy) {
this.iStrategy = iStrategy;
}
// 开始使用锦囊
public void operate() {
this.iStrategy.operate();
}
}
public class BackDoor implements IStrategy {
/**
* 妙计一 : 找乔国老帮忙,使孙权不能杀刘备
*/
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}
/**
* 妙计二:求吴国太开个绿灯
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行!");
}
}
/**
* 妙计三:孙夫人断后,挡住追兵
*/
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
public class ZhaoYun {
/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
* @param args
*/
public static void main(String[] args) {
Context context;
System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
context = new Context(new BackDoor());
context.operate();
System.out.println("\n\n");
System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
context = new Context(new GivenGreenLight());
context.operate();
System.out.println("\n\n");
System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
context = new Context(new BlockEnemy());
context.operate();
System.out.println("\n\n");
}
}
注:本文创作思路源于《设计模式之禅》
猜你喜欢
- 2024-09-30 Java策略模式在动态数据验证中的应用
- 2024-09-30 《设计模式》之策略模式(策略设计模式详解)
- 2024-09-30 Spring 中策略模式的 2 个经典应用
- 2024-09-30 Java策略模式实现动态验证不同来源的数据
- 2024-09-30 策略模式介绍以及具体使用场景(策略模式的优点及适用环境)
- 2024-09-30 什么是策略模式(策略模式的意图是什么)
- 2024-09-30 设计模式系列—策略模式(策略模式实现)
- 2024-09-30 快速带你彻底弄懂23种设计模式-策略模式
- 2024-09-30 「java设计模式」(7)——策略模式(案例解析)
- 2024-09-30 使用 Java 的策略设计模式(在java中找一个应用策略模式的实例)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)