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

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

    优点

      1、提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
      2、避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
      3、遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

    缺点

      没一种策略都会添加一个子类

    模式的组成
      环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
      抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
      具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

    实现

      在人们出门的出行方式,我们在这个场景进行实现。类图如下:

    ITravelStrategy的定义:

    package com.lidaming.design17.strategy;
    
    public interface ITravelStrategy {
        void travel();
    }
    View Code

    TravelContext的实现:

    package com.lidaming.design17.strategy;
    
    public class TravelContext {
        private ITravelStrategy travelStrategy;
    
        public TravelContext(ITravelStrategy strategy) {
            travelStrategy = strategy;
        }
    
        public void setStrategy(ITravelStrategy strategy) {
            travelStrategy = strategy;
        }
    
        public void travel() {
            travelStrategy.travel();
        }
    }
    View Code

    Bike的实现:

    package com.lidaming.design17.strategy;
    
    public class Bike implements ITravelStrategy {
    
        public void travel() {
            System.out.println(" travel by bike");
        }
    
    }
    View Code

    Train的实现:

    package com.lidaming.design17.strategy;
    
    public class Train implements ITravelStrategy {
    
        public void travel() {
            System.out.println("travel on train");
        }
    
    }
    View Code

    Bus的实现:

    package com.lidaming.design17.strategy;
    
    public class Bus implements ITravelStrategy {
    
        public void travel() {
            System.out.println("travel on bus");
        }
    
    }
    View Code

    场景类的实现:

    package com.lidaming.design17.strategy;
    
    public class Client {
        public static void main(String[] args) {
            TravelContext travelContext = new TravelContext(new Bike());
            travelContext.travel();
            
            System.out.println("it takes too long");
            
            travelContext.setStrategy(new Bus());
            travelContext.travel();
            
            
            System.out.println("it is too expensive");
            
            travelContext.setStrategy(new Train());
            travelContext.travel();
            
            System.out.println("it just fine");
        }
    }
    View Code

    参考

    http://blog.csdn.net/hguisu/article/details/7558249

  • 相关阅读:
    HDU 2112 HDU Today,最短路径算法,Dijkstra
    最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)
    图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)
    合并相同值得单元格(纵向)
    request.startAsync()不支持异步操作
    DIV强制不换行
    兼容各浏览器的css背景图片拉伸代码
    程序猿之八荣八耻
    使用JEECG过程中的问题汇总(持续更新)
    Firefox的缓存问题
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5436812.html
Copyright © 2011-2022 走看看