Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1277676
  • 博文数量: 185
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 3934
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-11 13:11
个人简介

iihero@ChinaUnix, ehero.[iihero] 数据库技术的痴迷爱好者. 您可以通过iihero AT qq.com联系到我 以下是我的三本图书: Sybase ASE in Action, Oracle Spatial及OCI高级编程, Java2网络协议内幕

文章分类

全部博文(185)

文章存档

2014年(4)

2013年(181)

分类: 项目管理

2013-07-26 10:57:31

概述

    定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

 适用性

    1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

    2.需要使用一个算法的不同变体。

    3.算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

    4.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。
      将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
			

参与者


    1.Strategy
      定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。

    2.ConcreteStrategy
      以Strategy接口实现某具体算法。

    3.Context
      用一个ConcreteStrategy对象来配置。
      维护一个对Strategy对象的引用。
      可定义一个接口来让Stategy访问它的数据。


类图


示例

  1. package com.sql9.actioned;  
  2.   
  3. /** 
  4.  * 策略模式 示例, 以数据库备份为例 
  5.  * @author iihero 
  6.  */  
  7.   
  8. abstract class Strategy {  
  9.     public abstract void backupDatabase();  
  10. }  
  11.   
  12. class StrategyImplA extends Strategy {  
  13.   
  14.     @Override  
  15.     public void backupDatabase() {  
  16.         System.out.println("策略1: 完全物理备份");  
  17.     }  
  18. }  
  19.   
  20. class StrategyImplB extends Strategy {  
  21.   
  22.     @Override  
  23.     public void backupDatabase() {  
  24.         System.out.println("策略2: 基础联机备份");  
  25.     }  
  26. }  
  27.   
  28. class StrategyImplC extends Strategy {  
  29.   
  30.     @Override  
  31.     public void backupDatabase() {  
  32.         System.out.println("策略3: 增量联机备份");  
  33.     }  
  34. }  
  35.   
  36. class DBContext {  
  37.     Strategy strategy;  
  38.     public DBContext(Strategy strategy) {  
  39.         this.strategy = strategy;  
  40.     }  
  41.     public void executeBackupDatabase() {  
  42.         strategy.backupDatabase();  
  43.     }  
  44. }  
  45.   
  46. public class StrategyTest {  
  47.   
  48.     public static void main(String[] args) {  
  49.         System.out.println("尝试策略A");  
  50.         DBContext context = new DBContext(new StrategyImplA());  
  51.         context.executeBackupDatabase();  
  52.           
  53.         System.out.println("==================");  
  54.         System.out.println("尝试策略B");  
  55.         context = new DBContext(new StrategyImplB());  
  56.         context.executeBackupDatabase();  
  57.           
  58.         System.out.println("==================");  
  59.         System.out.println("尝试策略C");  
  60.         context = new DBContext(new StrategyImplC());  
  61.         context.executeBackupDatabase();  
  62.     }  
  63. }  


结果

  1. 尝试策略A  
  2. 策略1: 完全物理备份  
  3. ==================  
  4. 尝试策略B  
  5. 策略2: 基础联机备份  
阅读(2027) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~