• JAVA设计模式--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.)
    Context(应用场景):
      1、需要使用ConcreteStrategy提供的算法。
      2、内部维护一个Strategy的实例。
      3、负责动态设置运行时Strategy具体的实现算法。
      4、负责跟Strategy之间的交互和数据传递。
    Strategy(抽象策略类):
      1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,
    一般使用接口或抽象类实现。
      ConcreteStrategy(具体策略类):
      2、 实现了Strategy定义的接口,提供具体的算法实现。
    应用场景:
      1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
      2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
      3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
    优点:
      1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
      2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
      3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
    缺点:
      1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。 

     如图 :

     

    举例:
    [java] 
    package design.strategy; 
    /**
     * 文件名称:design.strategy.IDiscount.java
     * 说明:打折算法基类
     * */ 
    public interface IDiscount { 
        void discount() ;  

     
     
     
     
    package design.strategy; 
    /**
     * 文件名称:design.strategy.DiscountHalf.java
     * 说明:打折种类算法
     * */ 
    public class DiscountHalf implements IDiscount { 
     
        @Override 
        public void discount() { 
            System.out.println( "---半价---" );  
        } 
         

     
     
     
     
    package design.strategy; 
    /**
     * 文件名称:design.strategy.DiscountEight.java
     * 说明:打折种类算法
     * */ 
    public class DiscountEight implements IDiscount { 
     
        @Override 
        public void discount() { 
            System.out.println( "---八折---" );  
        } 
         

     
     
     
     
    package design.strategy; 
     
    /**
     * 说明:用于选择策略
     */ 
    public class StrategyFactory { 
        IDiscount dis; 
         
        public StrategyFactory(int i) { 
            switch (i) { 
            case 0: 
                dis = new DiscountHalf(); 
                break; 
            case 1: 
                dis = new DiscountEight(); 
                break; 
            default: 
                dis = new DiscountEight(); 
                break; 
            } 
        } 
         
         public void showMessage() 
         { 
             dis.discount() ;  
         } 

     
     
     
     
    package design.strategy; 
    /**

     * 说明:测试类
     * */ 
    public class Main { 
     
        public static void main(String[] args) { 
            StrategyFactory factory = new StrategyFactory( 0 ) ; 
            factory.showMessage() ;  
        } 
         

  • 相关阅读:
    【转】【Egit】如何将eclipse中的项目上传至Git
    IntelliJ IDEA License Server本地搭建教程
    fastdfs-client-java工具类封装
    maven阿里云中央仓库
    Maven入门指南 :Maven 快速入门及简单使用
    如何在MyEclipse中配置jre的编译运行环境
    聚合函数 多次出现的某字段相同的记录。
    sql 过了试用期不能启动的,修改时间启动后还原。
    查看触发器内容
    Sql语句,先查询再插入一条语句完成。
  • 原文地址:https://www.cnblogs.com/lhfyy/p/4064958.html
Copyright © 2020-2023  润新知