`
这些年
  • 浏览: 402167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

zy19982004--设计模式学习一:策略模式

 
阅读更多

一.概念

     策略模式:它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。

 

二.UML

 

  1. Context(应用场景),持有Strategry对象的引用。
  2. Context能动态指定Strategry具体的实现。
  3. Context要使用Strategry提供的算法。
  4. Strategry(抽象策略类),定义了算法的骨架。
  5. ConcreteStrategryA-C实现类,提供算法的具体实现。

三.实例分析

     铁道部现需要一个订票网站,于是对外招标,有许多公司都参与了竞标,它们都有能力做出一个像样的网站出来。因为铁道部有钱撒,所以打算搞两三个系统出来,对外开放一个给大家订票,另外两个保留,一旦发现第一个系统不对劲,立马使用第二个系统。从这个里面,我们可以抽象出这样的几个类:

     ProjectPublisher:项目发布者,铁道部。

     ProjectTeamA-C:各个竞标公司。

     ProjectPublisher:

Java代码  收藏代码
  1. package com.zzy.strategry;  
  2.   
  3. /** 
  4.  * 项目发布者-铁道部 
  5.  * @author eason 
  6.  */  
  7. public class ProjectPublisher {  
  8.       
  9.     //持有ProjectTeam对象的引用  
  10.     private ProjectTeam projectTeam;  
  11.       
  12.     public ProjectPublisher(ProjectTeam projectTeam) {  
  13.         this.projectTeam = projectTeam;  
  14.     }  
  15.     //使用ProjectTeam提供的算法  
  16.     public void publishProject() {  
  17.         projectTeam.finshProject();  
  18.     }  
  19.     //能动态指定ProjectTeam具体的实现  
  20.     public void setProjectTeam(ProjectTeam projectTeam) {  
  21.         this.projectTeam = projectTeam;  
  22.     }  
  23.       
  24. }  

 

     ProjectTeam

Java代码  收藏代码
  1. package com.zzy.strategry;  
  2. /** 
  3.  * 抽象策略类 
  4.  * @author eason 
  5.  */  
  6. public abstract class ProjectTeam {  
  7.       
  8.     //定义了算法的骨架  
  9.     public abstract void finshProject();  
  10.       
  11. }  

 

     ProjectTeamA

Java代码  收藏代码
  1. package com.zzy.strategry;  
  2. /** 
  3.  * 策略实现类-每个竞标公司 
  4.  * @author eason 
  5.  */  
  6. public class ProjectTeamA extends ProjectTeam {  
  7.   
  8.     //提供算法的具体实现  
  9.     public void finshProject() {  
  10.         //TODO  
  11.         System.out.println("ProjectTeamA完成这个网站");  
  12.     }  
  13.       
  14. }  

 

     TestStrategry

Java代码  收藏代码
  1. package com.zzy.strategry;  
  2. /** 
  3.  * 测试类-client 
  4.  * @author eason 
  5.  */  
  6. public class TestStrategry {  
  7.       
  8.     public static void main(String[] args) {  
  9.         ProjectTeamA pa = new ProjectTeamA();  
  10.         ProjectTeamB pb = new ProjectTeamB();  
  11.         //首先ATeam的系统  
  12.         ProjectPublisher pub = new ProjectPublisher(pa);  
  13.         pub.publishProject();  
  14.         //媒体报道现在使用的订票网站,经常瘫痪  
  15.         //于是乎换了一个系统  
  16.         pub.setProjectTeam(pb);  
  17.         pub.publishProject();  
  18.     }  
  19.       
  20. }     

 

四.使用场景

  1. 一件事情,有很多方案可以实现。
  2. 我可以在任何时候,决定采用哪一种实现。
  3. 未来可能增加更多的方案。
  4. 策略模式让方案的变化不会影响到使用方案的客户。
  5. 在铁道部的例子中,我强调的“网站瘫痪”是为了来说明上面的第2点。实际上,对购票者来说,使用哪个系统都能够到票,这个“够到票”就叫没有影响到使用方案的用户。

五.使用感受

  1. 方便client使用,用户只需要拿到Context就能完成所有事情。
  2. OO原则中的组合优于继承。
  3. OO原则中的封装性。

     其他的优缺点,网上有,但我并不能完全理解,就不写了。    

 

分享到:
评论

相关推荐

    商业编程-源码-ZY music! v1.1.1.zip

    v1.1.1 是一个商业级别的音乐播放应用的源码版本,它提供了丰富的音乐播放功能,并且可能包含了一些针对商业环境优化的设计。这个源码是开发者学习和理解音乐应用开发的宝贵资源,特别是对于那些对Android或iOS平台...

    数据仓库培训教材

    - **维度建模**:一种将数据组织成维度和事实的方式,便于快速查询和分析。 #### 五、构建数据仓库:抽取数据简介 - **数据抽取**:从源系统中提取数据的过程。 - **清洗与转换**:清理数据并将其转换为适合加载到...

    ZY08-C遥控器控制小车程序代码

    【ZY08-C遥控器控制小车程序代码】是一个针对特定型号的小车——ZY08-C,设计的控制系统。这个程序的核心目标是接收来自遥控器的指令,解析这些指令,并根据指令来驱动小车进行相应的动作,如前进、后退、左转、右转...

    阿里数学竞赛试题

    - 满减策略的应用场景与设计 **知识点二:优惠券定价策略** - **题目概述**:假设新开一家电商店铺B,同样售卖与A店相同的耳机和音箱,标价相同。B店计划提供满99减x的优惠券,其中x为大于0且小于99的整数。问题...

    C++五子棋程序设计源代码集合

    根据提供的信息,我们可以总结并详细解释以下几个核心知识点: ### C++五子棋程序设计源代码解析 #### 1....- **图形库的使用**:程序使用了`graphics.h...对于初学者来说,这是一个很好的学习C++语法和编程逻辑的例子。

    深入了解LTE-A

    - **下行资源分配类型**:定义了不同类型的资源分配策略。 - **VRB到PRB的映射**:将虚拟资源块映射到物理资源块的过程。 - **如何确定调制阶数和TB size**:根据信道质量信息(CQI)来决定使用哪种调制方式和传输块...

    RF-YX-ZY-01-F03 住宅市场调查问卷.zip

    《RF-YX-ZY-01-F03 住宅市场调查问卷》是一个关于住宅市场的调研文档,主要关注的是中国房地产市场的消费者需求、购房行为以及对住宅品质和价格的认知。通过对这个压缩包中的“RF-YX-ZY-01-F03 住宅市场调查问卷.doc...

    RF-SJ-ZY-03 设计合同管理作业指引.zip

    ZY-03 设计合同管理作业指引》(以下简称《指引》)是一份针对设计行业合同管理流程的详细操作手册,它不仅提供了一系列操作步骤,而且对行业特点与法律风险进行了深入分析,从而帮助设计企业与从业人员构建起更为...

    设计模式详解-JAVA语言实现

    设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的经验总结。在Java编程中,设计模式的应用能够使代码更具可读性、可维护性和可扩展性。本资源"设计模式详解-JAVA语言实现"深入浅出地探讨了如何...

    RF-KF-ZY-04-F03 客户满意度调查分析报告(提纲).zip

    4. **报告结构**:一个完整的分析报告通常包括以下几个部分:介绍(背景与目的)、方法(调查设计与实施)、结果(数据展示与分析)、讨论(发现与解读)、结论(主要发现与建议)以及附录(原始数据或详细计算)。...

    RF-YX-ZY-01-F03 住宅市场调查问卷(1).zip

    3. 文档处理:《RF-YX-ZY-01-F03 住宅市场调查问卷(1).doc》表明文档使用了Microsoft Word格式,这是最常用的文本处理软件之一。在IT领域,熟练掌握文档处理软件是基础技能,包括创建、编辑、格式化文本、图表,以及...

    RF-YX-ZY-06-F06 客户入场统计表.zip

    《RF-YX-ZY-06-F06 客户入场统计表》是一个与客户管理相关的数据文件,其核心内容是收集和分析客户入场的相关数据。这个文件采用的是Excel(.xls)格式,这是一种广泛应用于数据处理、数据分析和报告生成的电子表格...

    RF-CB-ZY-01 目标成本管理作业指引(1).zip

    目标成本管理是企业财务管理中的一个重要概念,尤其在IT行业中,对于项目预算控制和...通过对"RF-CB-ZY-01 目标成本管理作业指引(1).doc"的学习和实践,企业可以更好地理解和运用这一管理工具,实现成本效益的最大化。

    HeadFirst设计模式

    《HeadFirst设计模式》是一本深受开发者喜爱的设计模式入门书籍,以其独特的教学方式,通过丰富的图解和幽默的语言,使得复杂的设计模式概念变得易于理解。这本书涵盖了23种经典的GoF设计模式,以及一些现代软件开发...

    RF-GC-ZY-05-F02 精装重要分项工程施工要点(1).zip

    2. **规范与标准**:精装工程通常遵循一系列的建筑规范和行业标准,这与IT领域的编程规范、设计模式、安全标准等有相似之处。遵守标准能确保项目的稳定性和可维护性。 3. **流程细化**:分项工程意味着将大项目分解...

    微机接口技术试验书

    - 微机接口技术是计算机科学中的一个重要分支,它涉及如何设计和实现微处理器与外部设备之间的通信机制。 - 本书旨在介绍微机接口技术的基本原理和实践方法,帮助读者掌握微机系统的设计与应用。 2. **系统主要...

    RF-KF-ZY-04-F03 客户满意度调查分析报告(提纲)(1).zip

    《RF-KF-ZY-04-F03 客户满意度调查分析报告(提纲)》是一个关于评估和提升客户满意度的重要文档。这份报告通常包括了对客户满意度调查的全面规划,旨在帮助企业深入了解客户的需求、期望以及他们对产品或服务的体验...

    RF-YX-ZY-05-F05 销售代理服务供方甄选评分表(1).zip

    7. **合作意愿与条件**:分析供方的合作态度、合作期限、合作模式(独家代理、区域代理等)以及价格策略等,以确保双方的利益一致。 8. **风险评估**:识别可能的法律风险、商业风险,比如诉讼历史、信用记录,以...

    RF-GC-ZY-08-F02 甲供及三方供货材料进场计划(1).zip

    "RF-GC-ZY-08-F02 甲供及三方供货材料进场计划(1)"是一个关于建筑材料管理的文档,主要涉及甲供材料(即由甲方提供的材料)以及第三方供货材料的进场计划。此文档的重要性在于确保工程项目的顺利进行,避免因材料...

    RF-KF-ZY-04 客户满意度调查作业指引.zip

    总的来说,RF-KF-ZY-04 客户满意度调查作业指引是一份综合性的指导文档,它为企业提供了一套标准化的流程,从设计调查到实施,再到分析结果和采取行动,以期最大化地利用客户反馈,驱动企业的持续改进和发展。...

Global site tag (gtag.js) - Google Analytics