策略模式:定义一系列算法,分别分装起来,这些算法相互间可以替换并且不会影响到使用算法的客户。
例子:肯德基推出一系列套餐,套餐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、新增一个算法对业务代码的改动很小,配合工厂模式下几乎不需要改动业务代码,只需要增加相应算法的具体实现即可。(扩展性强)
策略模式适用的场景:有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。
分享到:
相关推荐
《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...
这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...
《深入浅出设计模式》是一本深受欢迎的设计模式学习书籍,旨在帮助读者理解并熟练运用设计模式。在本文中,我们将重点关注策略模式以及它与三个核心设计原则的关系。策略模式是一种行为设计模式,它使你能在运行时...
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...
以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...
在本文中,我们将探讨三个主要的设计模式:简单工厂模式、策略模式以及两个重要的设计原则:单一职责原则和开放-封闭原则。 1. **简单工厂模式**: 简单工厂模式是一种创建型设计模式,它将对象实例化的责任集中在...
这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...
在《深入浅出设计模式》的学习笔记中,我们可以看到几种关键的设计模式及其应用,包括策略模式、观察者模式、装饰者模式、工厂模式和抽象工厂模式。 1. **策略模式**: - 策略模式的核心在于将算法族封装在独立的...
在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...
### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...
2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...
在计算机科学领域,设计模式是软件工程中用于解决特定问题的一般性方案,它们是经过实践检验的最佳实践。这些模式被广泛应用于面向对象软件...设计模式的学习与应用是软件工程专业人员不断成长和进步的重要途径之一。
### 《设计模式解析》第2版学习笔记关键知识点总结 #### 第一部分 面向对象软件开发简介 ##### 第一章 面向对象范型 - **面向对象范型概览**: - 本章通过对比结构化程序设计来引入面向对象的概念。 - 强调了...
这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。