一.概念
策略模式:它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。
二.UML
- Context(应用场景),持有Strategry对象的引用。
- Context能动态指定Strategry具体的实现。
- Context要使用Strategry提供的算法。
- Strategry(抽象策略类),定义了算法的骨架。
- ConcreteStrategryA-C实现类,提供算法的具体实现。
三.实例分析
铁道部现需要一个订票网站,于是对外招标,有许多公司都参与了竞标,它们都有能力做出一个像样的网站出来。因为铁道部有钱撒,所以打算搞两三个系统出来,对外开放一个给大家订票,另外两个保留,一旦发现第一个系统不对劲,立马使用第二个系统。从这个里面,我们可以抽象出这样的几个类:
ProjectPublisher:项目发布者,铁道部。
ProjectTeamA-C:各个竞标公司。
ProjectPublisher:
package com.zzy.strategry;
/**
* 项目发布者-铁道部
* @author eason
*/
public class ProjectPublisher {
//持有ProjectTeam对象的引用
private ProjectTeam projectTeam;
public ProjectPublisher(ProjectTeam projectTeam) {
this.projectTeam = projectTeam;
}
//使用ProjectTeam提供的算法
public void publishProject() {
projectTeam.finshProject();
}
//能动态指定ProjectTeam具体的实现
public void setProjectTeam(ProjectTeam projectTeam) {
this.projectTeam = projectTeam;
}
}
ProjectTeam
package com.zzy.strategry;
/**
* 抽象策略类
* @author eason
*/
public abstract class ProjectTeam {
//定义了算法的骨架
public abstract void finshProject();
}
ProjectTeamA
package com.zzy.strategry;
/**
* 策略实现类-每个竞标公司
* @author eason
*/
public class ProjectTeamA extends ProjectTeam {
//提供算法的具体实现
public void finshProject() {
//TODO
System.out.println("ProjectTeamA完成这个网站");
}
}
TestStrategry
package com.zzy.strategry;
/**
* 测试类-client
* @author eason
*/
public class TestStrategry {
public static void main(String[] args) {
ProjectTeamA pa = new ProjectTeamA();
ProjectTeamB pb = new ProjectTeamB();
//首先ATeam的系统
ProjectPublisher pub = new ProjectPublisher(pa);
pub.publishProject();
//媒体报道现在使用的订票网站,经常瘫痪
//于是乎换了一个系统
pub.setProjectTeam(pb);
pub.publishProject();
}
}
四.使用场景
- 一件事情,有很多方案可以实现。
- 我可以在任何时候,决定采用哪一种实现。
- 未来可能增加更多的方案。
- 策略模式让方案的变化不会影响到使用方案的客户。
- 在铁道部的例子中,我强调的“网站瘫痪”是为了来说明上面的第2点。实际上,对购票者来说,使用哪个系统都能够到票,这个“够到票”就叫没有影响到使用方案的用户。
五.使用感受
- 方便client使用,用户只需要拿到Context就能完成所有事情。
- OO原则中的组合优于继承。
- OO原则中的封装性。
其他的优缺点,网上有,但我并不能完全理解,就不写了。
分享到:
相关推荐
3 策略模式 4 模板方法模式 5 工厂方法模式 6 抽象工厂模式 7 建造者模式 8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+...
策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这样,算法独立于使用它的客户而...
### 设计模式学习报告 #### 一、设计模式概述 设计模式是一种被广泛接受和使用的编程解决方案,旨在解决软件设计中的常见问题。它不仅能够帮助开发者编写出更易于理解和维护的代码,还能够促进代码的复用性。设计...
《设计模式:可复用面向对象软件的基础》是一本经典的软件工程著作,它详细阐述了在面向对象编程中,如何通过使用预定义的解决方案模板来解决常见问题,从而提高代码的可读性、可维护性和复用性。设计模式是经验丰富...
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...
本书从一个新的视角描述面向对象设计,将面向中对象编程的原则与运用设计模式力量创建健壮、可靠的软件开发环境结合起来。书中采用实用、恰当的例子,指导读者用模式解决普通的编程问题,并且解释现代软件设计模式的...
在软件开发领域,设计模式是一种经过时间和实践验证的解决方案,用于解决常见的设计问题。这些模式是面向对象编程中的宝贵资源,因为它们提供了一种标准化的方法来处理对象间的交互和结构。"C#设计模式"这一主题,...
《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...
这个“设计模式学习ppt”资料包显然是一份面向初学者或大学生的教学资源,通过十四个PPT文件深入浅出地讲解了设计模式的各个方面。 首先,我们来看设计模式的基本概念。设计模式是对在特定上下文中反复出现的问题...
这篇“设计模式学习心得(研磨设计模式)”博客及其相关的PDF文档,为我们提供了一个深入理解和应用设计模式的宝贵资源。以下将针对单例模式、工厂方法模式、策略模式、命令模式和桥接模式进行详细讲解。 1. **单例...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景执行不同策略的情况。策略模式就是为了解决这类问题而诞生的,它将算法封装到具有共同接口的独立...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这些算法类都实现了一个公共接口,使得它们可以被相同的客户端代码调用,而...
本书主要面向已经具备一定面向对象编程基础的读者,旨在通过一系列设计模式的学习,提升读者在实际项目中的设计能力。 #### 核心内容解析 ##### 什么是设计模式? 设计模式是针对软件设计中出现的常见问题而提出...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...
设计模式的历史:了解设计模式的起源,特别是《设计模式:可复用面向对象软件的基础》这本书。 2. 学习常见设计模式 逐一学习:选择一些常见的设计模式(如单例模式、工厂模式、观察者模式、策略模式等),深入...
第一章重点介绍了策略模式,这是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。 策略模式的...
GOF(GoF)23种设计模式,是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大神在他们的著作《设计模式:可复用面向对象软件的基础》中提出的,这些模式分为创建型、结构型和行为型三大类。...
《Gof设计模式设计模式设计模式PDF》是一个深入学习设计模式的重要资源,包含了全面而详尽的设计模式理论和实践知识。设计模式是软件工程中的一种最佳实践,它为解决常见问题提供了一种可复用的解决方案,使得代码...
《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为型三种主要类型的23个经典设计模式,并提供了C++语言的实现代码。设计模式是软件工程中的...