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

  • 相关阅读:
    大话设计模式--中介者模式
    大话设计模式--职责链模式
    大话设计模式--命令模式
    大话设计模式--桥接模式
    迷宫求解
    stuct、class、typedef
    软件测试
    Scrapy初探
    python练习
    链表基础
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5436812.html
Copyright © 2011-2022 走看看