zoukankan      html  css  js  c++  java
  • Strategy

    定义

      策略模式属于对象的行为模式。针对一组算法(行为,策略),将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生改变。

    解决问题

      算法(行为)和客户端耦合在一起,客户端要利用条件选择语句来决定使用哪一个算法。使得客户端的代码变得复杂和难以维护,也不利于代码重用。

    结构和角色

        

             环境(Context)角色 : 持有一个Strategy类的引用。

             抽象策略(Strategy)角色 : 所有具体策略的父类,可以是抽象类,接口,此角色用于定义具体策略类的行为。

             具体策略(ConcreteStrategy)角色 :  封装具体的算法或行为。

    public class Context {
        private Strategy strategy;  // 省略 set get 方法
    
        public void contextOperation() {
            strategy.operation();
        }  
    
    }
    public  interface Strategy{
        public void operation();
    }
    
    
    public class ConcreteStrategy implements Strategy{ 
        public void operation() {
        // ...
        } 
    }
    
    public class ConcreteStrategy2 implements Strategy{
        public void operation() {
        // ...
        } 
    }

    项目中使用例子

      项目的界面显示数据表有普通表格,自动排序,可拖拽,等几种表格。

    Table和View是分离的,在View中可以根据需求设置Table。如果增加Table类型,不会影响到View。Table也是可重用的。

    (二)

      打印报表时,可以选择多种文件显示,这里也用到了策略模式。(具体省略)

    使用场景

      一个系统需要动态地在几种算法中选择一种。

      一个系统的算法使用的数据不可以让客户端知道,即算法的具体实现对客户端是隐藏的。

      如果一个对象有很多行为,且需要使用多重条件选择语句来实现。

    优缺点

      封装算法,使算法和客户端分离,降低耦合,使得算法本身具有可重用性。

      策略模式提供了管理相关的算法族的方法,策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复代码。

      策略模式提供了替换继承关系的办法。

      避免使用多重条件转移语句。

      缺点

      客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

      策略模式造成很多的策略类。

    Strategy模式背后的三个面向对象设计原则:

      封装变化,算法是可以变化的,所以将它与客户端分离使得算法的变化不影响客户端,降低耦合。封装后的算法可重用。

      面向接口编程,要使具体策略类能够相互替换,那么客户端内必须要有他们共同的接口。

      组合优于继承,环境类使用的是组合而非继承。

  • 相关阅读:
    下载PDF格式的Html
    EnumHelper.cs
    FtpHelper.cs
    Windows下用cmd命令安装及卸载服务
    c# list排序
    用NOPI将图片二进制流导出到Excel
    jquery的clone方法 于textarea和select的bug修复
    时间戳格式化函数
    快速激活Navicat Premium 12
    防止应用程序重复打开
  • 原文地址:https://www.cnblogs.com/shouwangzhe-/p/3562276.html
Copyright © 2011-2022 走看看