zoukankan      html  css  js  c++  java
  • 策略模式

    定义:针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    角色:
    Context(应用场景):需要使用ConcreteStrategy提供的算法。 内部维护一个Strategy的实例,通过动态改变Strategy实例(赋值或其他)改变调用的算法。负责动态设置运行时Strategy具体的实现算法。负责跟Strategy之间的交互和数据传递。
    Strategy(抽象策略类):定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
    ConcreteStrategy(具体策略类):实现了Strategy定义的接口,提供具体的算法实现。


    结构图:


    优点: 

    1、提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。

    2、避免使用多重条件判断,使系统更灵活,并易于扩展。

    3、遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。


    缺点: 

    1、策略类会增多。

    2、所有策略类都需要对外暴露。


    使用:Context 是一个使用了某种策略的类。StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
    1.创建一个接口:

    public interface Strategy 
    {
       public int doOperation(int num1, int num2);
    }

    2.创建实现接口的实体类:

    public class OperationAdd implements Strategy
    {
       public Override int doOperation(int num1, int num2) {
          return num1 + num2;
       }
    }
    
    public class OperationSubstract implements Strategy
    {
       public Override int doOperation(int num1, int num2) {
          return num1 - num2;
       }
    }
    
    public class OperationMultiply implements Strategy
    {
       public Override int doOperation(int num1, int num2) {
          return num1 * num2;
       }
    }

    3.创建 Context 类:

    public class Context 
    {
       private Strategy strategy;
    
       public Context(Strategy strategy)
       {
          this.strategy = strategy;
       }
    
       public int executeStrategy(int num1, int num2)
       {
          return strategy.doOperation(num1, num2);
       }
    }

    4.使用 Context 来查看当它改变策略 Strategy 时的行为变化。

    Context context = new Context(new OperationAdd());
    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    context
    = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    context
    = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    一些精简的小技巧
    POJ题目分类(转)
    【慢慢学算法】:连通图
    【菜鸟做水题】: 杭电1004
    杭电ACM试题分类,一步一个脚印!(转)
    【慢慢学Android】:获得当前时间
    【慢慢学算法】:小白鼠排队
    【慢慢学Android】:12.Notification示例
    【慢慢学Android】:13.打电话代码
    “/”应用程序中的服务器错误。
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8321111.html
Copyright © 2011-2022 走看看