`
AutomaticThoughts
  • 浏览: 165501 次
社区版块
存档分类
最新评论

设计模式读书笔记之策略模式(Strategy) .

 
阅读更多

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化.
(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable.

Strategy lets the algorithm vary independently from clients that use it.)

策略模式的特点:
1 Context(应用实例或client, 即使用Strategy的类)持有一个Strategy实例;
2 Context可以动态灵活的设置Strategy的具体实例,即切换算法;
3 Context通过调用strategy的方法来执行具体的行为。

示例代码:

 

这个例子很抽象,大多数的设计模式书中都会给出这么个例子,这个例子不具备任何生产价值,于是我想到了一个更好的例子:
笔记本电脑中都有一个电源管理器,提供多种电源管理方案。每个方案都是一种策略,操作系统(或使用电脑的人)应该能灵活切换供电方案。下面用代码模拟:

 

  1. //策略接口   
  2. package designpattern.strategy;  
  3.   
  4. public interface PowerStrategy {  
  5.     public void apply();  
  6. }  
  7.   
  8. //引用实例,持有策略者   
  9. package designpattern.strategy;  
  10.   
  11. public class Computer {  
  12.     private PowerStrategy ps;  
  13.     public PowerStrategy getPs() {  
  14.         return ps;  
  15.     }  
  16.     public void setPs(PowerStrategy ps) {  
  17.         this.ps = ps;  
  18.     }  
  19.     public void applyPowerStrategy(){  
  20.         ps.apply();  
  21.     }  
  22. }  
  23.   
  24. //策略1 高表现性能策略   
  25. package designpattern.strategy;  
  26.   
  27. public class HighPerformanceStrategy implements PowerStrategy{  
  28.     public void apply() {  
  29.         System.out.println("*** High performance power strategy ***");  
  30.         System.out.println("Turn off monitor: Never;");  
  31.         System.out.println("Turn off hard disk: Never;");  
  32.         System.out.println("System standby: Never;");  
  33.         System.out.println("System hibernates: Never./n");  
  34.     }  
  35. }  
  36. //策略2 中等策略   
  37. package designpattern.strategy;  
  38.   
  39. public class MediumStragegy implements PowerStrategy{  
  40.     public void apply() {  
  41.         System.out.println("*** Medium power strategy ***");  
  42.         System.out.println("Turn off monitor: 1 hour;");  
  43.         System.out.println("Turn off hard disk: 2 hours;");  
  44.         System.out.println("System standby: 3 hours;");  
  45.         System.out.println("System hibernates: 4 hours./n");  
  46.     }  
  47. }  
  48.   
  49. //策略3 节能策略   
  50. package designpattern.strategy;  
  51.   
  52. public class EnergySavingStrategy implements PowerStrategy{  
  53.     public void apply() {  
  54.         System.out.println("*** Energy-saving strategy ***");  
  55.         System.out.println("Turn off monitor: 5 minutes;");  
  56.         System.out.println("Turn off hard disk: 15 minutes;");  
  57.         System.out.println("System standby: 30 minutes;");  
  58.         System.out.println("System hibernates: 1 hour./n");  
  59.     }  
  60. }  
  61.   
  62.   
  63. //测试用例   
  64. package designpattern.strategy;  
  65.   
  66. public class Test {  
  67.     public static void main(String[] args){  
  68.         Computer c = new Computer();  
  69.         c.setPs(new HighPerformanceStrategy());  
  70.         c.applyPowerStrategy();  
  71.           
  72.         c.setPs(new MediumStragegy());  
  73.         c.applyPowerStrategy();  
  74.           
  75.         c.setPs(new EnergySavingStrategy());  
  76.         c.applyPowerStrategy();  
  77.     }  
  78. }  

 

经典案例:

1 jdk中的类File有一个方法:public String[] list(FilenameFilter filter),列出当前目录下的所有文件,FilenameFilter就是一个策略接口,使用者可以根据自己的需求自由变换文件筛选策略.
2 jdk中工具类Arrays有一个可以对集合排序的方法: public static <T> void sort(T[] a, Comparator<? super T> c),传入一个数组和一个比较器, 这个比较器就是一个策略.(此案有争议,有人认为是template method模式).

应用场景:
1 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为;
2 需要在不同情况下使用不同的策略(算法)。

优点:
把容易发生变化的算法独立出来,易于扩展。

缺点:

类增多了,使系统难度加大。

  1. class StrategyExample {  
  2.     //test case.   
  3.     public static void main(String[] args) {  
  4.         Context context;  
  5.         // Three contexts following different strategies   
  6.         context = new Context(new FirstStrategy());  
  7.         context.execute();  
  8.           
  9.         context = new Context(new SecondStrategy());  
  10.         context.execute();  
  11.           
  12.         context = new Context(new ThirdStrategy());  
  13.         context.execute();  
  14.     }  
  15.    
  16. }  
  17.    
  18. // Strategy interface   
  19. // The context class uses this to call the concrete strategy   
  20. interface Strategy {  
  21.     void execute();  
  22. }  
  23.    
  24. // Implements the algorithm using the strategy interface   
  25. class FirstStrategy implements Strategy {  
  26.     public void execute() {  
  27.         System.out.println("Called FirstStrategy.execute()");  
  28.     }  
  29. }  
  30.    
  31. class SecondStrategy implements Strategy {  
  32.     public void execute() {  
  33.         System.out.println("Called SecondStrategy.execute()");  
  34.     }  
  35. }  
  36.    
  37. class ThirdStrategy implements Strategy {  
  38.     public void execute() {  
  39.         System.out.println("Called ThirdStrategy.execute()");  
  40.     }  
  41. }  
  42.   
  43. // Configured with a ConcreteStrategy object and maintains a reference to a Strategy object   
  44. class Context {  
  45.     Strategy strategy;  
  46.     // Constructor   
  47.     public Context(Strategy strategy) {  
  48.         this.strategy = strategy;  
  49.     }  
  50.     public void execute() {  
  51.         this.strategy.execute();  
  52.     }  
  53. }  
分享到:
评论

相关推荐

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    《Head First设计模式》读书笔记 -- (第一章)策略模式

    第一章主要讲解的是策略模式,这是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式的核心思想是定义一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。 策略模式的...

    设计模式的读书总结笔记

    这篇“设计模式的读书总结笔记”是对设计模式深入理解和应用的结晶,包含对各种模式的实例解析、优缺点分析以及如何在实际项目中应用的指导。 一、设计模式的基本概念 设计模式并不直接提供代码实现,而是描述在...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    设计模式之蝉

    书中包含了作者的个人读书笔记,这表明除了正文内容之外,作者还提供了自己的理解与见解,这些笔记可能对理解设计模式的精髓与实际应用有很大的帮助。 在内容部分,我们可以看到有关于设计模式的一些具体讨论,例如...

    JAVA与模式读书笔记。

    在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    设计模式复习笔记大全

    ### 设计模式复习笔记大全 #### 一、设计模式概览 **设计模式**是一种用于在特定场景下解决常见设计问题的方案。它通常描述了一组相互作用的类和对象,以及这些对象如何通信来解决问题。设计模式的核心要素包括...

    设计模式学习笔记

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许我们定义一系列算法,并将每一个算法封装起来,使得它们可以相互替换,同时让算法的变化独立于使用算法的客户。 策略模式的核心概念包括...

    C#设计模式学习笔记

    C#设计模式学习笔记是一份详尽的资源,适合任何希望深入了解如何在C#编程中应用设计模式的开发者。这份笔记涵盖了多种设计模式,旨在提升代码的可读性、可维护性和可扩展性,这些都是软件开发中至关重要的要素。 ...

    图解Java设计模式笔记总结word版本.rar

    本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析各种设计模式。以下是基于这个主题的详细知识点讲解: 1. **设计模式的分类** - **创建型模式**:如单例(Singleton)、工厂...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    台湾人写的设计模式笔记

    这份由台湾作者编写的笔记,结合Java语言,为读者提供了一种深入理解并应用设计模式的方式。以下是对这些设计模式的详细解释: 1. **创建型模式(Creational Patterns)** 创建型模式关注于对象的创建过程,它们帮助...

    设计模式总结笔记设计模式总结笔记

    ### 设计模式总结笔记 #### 一、概述 设计模式是一种在特定上下文中解决软件设计问题的方案。它并不是一种现成的代码片段或者框架,而是一种指导思想,帮助开发者理解如何更好地组织代码来解决问题。设计模式可以...

    设计模式 笔记(附带代码)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。策略类定义了算法族,分别封装起来,让它们之间可以互相替换...

    图解java设计模式_学习笔记_java开发

    这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    新版设计模式手册-笔记

    《新版设计模式手册》中的笔记通过21个设计模式的概念图,直观地展示了这些模式的结构和交互方式,帮助读者形成清晰的认识。同时,生活类比将复杂的编程概念与日常经验相结合,使学习更加生动有趣。例如,单例模式...

Global site tag (gtag.js) - Google Analytics