设计模式学习笔记(一):策略模式

来源:互联网 发布:淘宝店怎么提升信誉 编辑:程序博客网 时间:2024/05/17 03:50

设计模式学习教程

《Java与模式》(--阎宏博士著)读书笔记


一.概念

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

 

二.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原则中的封装性。
0 0
原创粉丝点击