策略模式:定义一系列算法,分别分装起来,这些算法相互间可以替换并且不会影响到使用算法的客户。
例子:肯德基推出一系列套餐,套餐A(一个巨无霸汉堡,一杯大可,一份薯条)、套餐B(双份汉堡,两杯中可,一份薯条)、套餐C(全家桶,一堆堆鸡块鸡翅,一大瓶可乐)。假设一个顾客来点餐只能点ABC套餐中的一个,按一般写法代码如下:
Maximal
public class MainClass {
/**
* 普通实现方式
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String mealName = null;
System.out.println("Please enter your main meal:");
mealName = br.readLine();
if("mealA".equals(mealName)) {
System.out.println("一个巨无霸汉堡,一杯大可,一份薯条");
} else if("mealB".equals(mealName)) {
System.out.println("双份汉堡,两杯中可,一份薯条");
} else if("mealC".equals(mealName)) {
System.out.println("全家桶,一堆堆鸡块鸡翅,一大瓶可乐");
} else {
System.out.println("您点的套餐不存在");
}
}
}
使用策略模式实现方式:
//套餐接口
public interface Meal {
public void chooseMeal();
}
//套餐A算法类
public class MealA implements Meal {
/**
* A套餐具体实现方法
*/
@Override
public void chooseMeal() {
System.out.println("套餐A:");
System.out.println("一个巨无霸汉堡,一杯大可,一份薯条");
}
}
//套餐B算法类
public class MealB implements Meal {
/**
* B套餐具体实现方法
*/
@Override
public void chooseMeal() {
System.out.println("套餐B:");
System.out.println("双份汉堡,两杯中可,一份薯条");
}
}
//套餐C算法类
public class MealC implements Meal {
/**
* C套餐具体实现方法
*/
@Override
public void chooseMeal() {
System.out.println("套餐C:");
System.out.println("全家桶,一堆堆鸡块鸡翅,一大瓶可乐");
}
}
//上下文
public class MealContext {
Meal meal = null;
public MealContext(Meal meal) {
this.meal = meal;
}
//上下文接口
public void chooseMeal() {
meal.chooseMeal();
}
}
//业务代码
public class MainClassForStrategy {
/**
* 策略模式业务代码
* @param args
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String mealName = null;
MealContext context = null;
System.out.println("Please enter your main meal:");
mealName = br.readLine();
//if...else代码可用简单工厂模式来优化
if("mealA".equals(mealName)) {
context = new MealContext(new MealA());
} else if("mealB".equals(mealName)) {
context = new MealContext(new MealB());
} else if("mealC".equals(mealName)) {
context = new MealContext(new MealC());
} else {
System.out.println("您点的套餐不存在");
}
//调用具体实现算法
context.chooseMeal();
}
}
相比普通实现代码,策略模式实现代码的优点:
1、修改某个具体算法的实现方式对其它算法以及业务代码没有任何影响。(低耦合度)
2、新增一个算法对业务代码的改动很小,配合工厂模式下几乎不需要改动业务代码,只需要增加相应算法的具体实现即可。(扩展性强)
策略模式适用的场景:有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。
分享到:
相关推荐
http://blog.csdn.net/laszloyu/archive/2010/05/11/5579765.aspx 示例代码
javascript设计模式之策略模式学习笔记.docx
2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...
工厂模式,策略模式,装饰模式,代理模式,工厂方法模式,原型模式等23个设计模式
主要介绍了javascript设计模式之策略模式学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java Design PatternsJava 设计模式学习笔记,简单易懂,每个模式都有相应的代码示列,帮助学习理解。在线阅读地址:设计原则创建型模式作用:将创建与使用代码解耦结构型模式作用:将不同的功能代码解耦桥接模式...
设计模式可以分为三类:创建型模式、结构型模式和行为型模式。 1. 创建型模式:创建型模式关注对象的创建过程,包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式和单例模式。这些模式可以帮助...
设计模式学习笔记,此项目参考《大话设计模式》,只能作为入门级设计模式学习 设计原则 职责单一原则 开放-封闭原则 依赖倒转原则 高层模块不依赖底层模块,两个模块都应该依赖抽象。抽象不依赖细节,细节依赖抽象。...
主要为大家详细介绍了javascript设计模式之中介者模式学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
和张容铭的javascript设计模式相比,个人觉得有以下不同之处: 1、需要对原型链和闭包有一定的基础 2、案例比较经典并且通熟易懂,讲解特别清晰 3、知识点的归纳总结也比较突出重点,方便二次学习以及做笔记 字体...
VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...
JS-design-pattern根据曾探所著《JavaScript设计模式与开发实践》整理的学习笔记基础知识创建模式结构模式行为模式状态模式策略模式发布订阅模式
{14.2}XML的设计}{205}{section.14.2} {14.3}DTD/Schema}{205}{section.14.3} {14.3.1}SAX应用}{206}{subsection.14.3.1} {14.4}dom4j}{207}{section.14.4} {14.5}XPath}{210}{section.14.5} {14.6}apache....
describe:设计模式学习笔记 逻辑结构图 代码结构图 设计模式简述 创建型模式,共五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式,共七种:适配器模式,装饰器模式,代理模式,...
本文实例讲述了Javascript面向对象程序设计对象成员的定义。分享给大家供大家参考,具体如下: 序: 刚接触javascript的时候,觉得这语言有点儿摸不着门道,感觉这玩意儿太难学了,没什么规范,没什么像样的手册,...
第一部分:设计模式 & UML 简单工厂 工厂方法模式 抽象工厂模式 策略模式 责任链模式 命令模式 模板方法模式 适配器模式 代理模式 外观模式 组合模式 装饰模式 享元模式 桥接模式 Builder模式 状态模式 解释器模式 ...
study-notes个人学习笔记目录JavaScriptCSSHTML碎片知识点lifecircleReact虚拟DOMJSXbuild-your-own-reactHTTPHttp 协议跨域HTTPSTCP/IP资源缓存js设计模式策略模式中介者模式单例模式观察者模式发布订阅模式数据...
设计模式之UML 类图以及类间关系(泛化 、实现、依赖、关联、聚合、组合) 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试...