Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3587902
  • 博文数量: 1575
  • 博客积分: 19423
  • 博客等级: 上将
  • 技术积分: 16102
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-19 21:36
个人简介

专注专心

文章分类

全部博文(1575)

文章存档

2020年(10)

2018年(7)

2016年(6)

2015年(21)

2014年(32)

2013年(279)

2012年(516)

2011年(309)

2010年(260)

2009年(92)

2008年(15)

2007年(28)

我的朋友

分类: 项目管理

2013-07-27 20:48:04

概述

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

 适用性

    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: 基础联机备份  
阅读(1006) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~