zoukankan      html  css  js  c++  java
  • GoF23种设计模式之行为型模式之策略模式

    1概述

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

    2适用性

    (1)许多相关的类仅仅是行为存在差异的时候。“策略”提供了一种使用多个行为中的一个来配置一个类的方法。
    (2)需要使用一个算法的不同变体的时候。
    (3)算法使用了客户不应该知道的数据的时候。以避免暴露复杂的、与算法相关的数据结构。
    (4)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现的时候。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。    

    3参与者

    (1)Strategy:定义所有支持的算法的公共接口。Context使用这个接口来调用某个ConcreteStrategy定义的算法。
    (2)ConcreteStrategy:实现Strategy接口的某种具体算法。
    (3)Context:用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Stategy访问它的数据。

    4类图

     

    5示例

    Strategy
    [java] view plain copy
     
     print?
    1. package cn.lynn.strategy;  
    2.   
    3. public abstract class DBHelper {  
    4.   
    5.     public abstract void crud();  
    6.   
    7. }  
    ConcreteStrategy
    [java] view plain copy
     
     print?
    1. package cn.lynn.strategy;  
    2.   
    3. public class JdbcTemplateImpl extends DBHelper {  
    4.   
    5.     @Override  
    6.     public void crud() {  
    7.         System.out.println("使用JDBC方式操作数据库!");  
    8.     }  
    9.   
    10. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.strategy;  
    2.   
    3. public class HibernateFactoryImpl extends DBHelper {  
    4.   
    5.     @Override  
    6.     public void crud() {  
    7.         System.out.println("使用Hibernate持久化方式操作数据库!");  
    8.     }  
    9.   
    10. }  
    Context
    [java] view plain copy
     
     print?
    1. package cn.lynn.strategy;  
    2.   
    3. public class Context {  
    4.   
    5.     private DBHelper dbHelper;  
    6.   
    7.     public Context(DBHelper dbHelper) {  
    8.         this.dbHelper = dbHelper;  
    9.     }  
    10.       
    11.     public void execute() {  
    12.         dbHelper.crud();  
    13.     }  
    14. }  
    Client
    [java] view plain copy
     
     print?
    1. package cn.lynn.strategy;  
    2.   
    3. public class Client {  
    4.   
    5.     public static void main(String[] args) {  
    6.         Context context = new Context(new JdbcTemplateImpl());  
    7.         context.execute();  
    8.         context = new Context(new HibernateFactoryImpl());  
    9.         context.execute();  
    10.     }  
    11.   
    12. }  
    Result
    [java] view plain copy
     
     print?
    1. 使用JDBC方式操作数据库!  
    2. 使用Hibernate持久化方式操作数据库!  
     
    6
  • 相关阅读:
    MVC的异步,Entity Framework的异步,ADO.NET的异步,
    IE10、IE11 无法写入Cookie
    jQuery在IE浏览器上的html()报错 return !noData || noData !== true && elem.getAttribute("classid") === noData;
    站点、应用程序和虚拟目录详细介绍
    javascript中的一些核心知识点以及需要注意的地方
    $.browser.msie 报错 null
    【转】虚拟机安装Ubuntu的上网设置(有线网络和无线网络)
    Linux编程(获取系统时间)
    【Java】解析xml
    【Java】多线程
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471478.html
Copyright © 2011-2022 走看看