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

  • 相关阅读:
    JS数组存储(两个数组相等,一个改变,另一个跟着改变)
    图片404加载失败后如何处理
    为什么重写equals方法,还必须要重写hashcode方法
    Java中HashMap和TreeMap的区别深入理解
    java中String数组和List的互相转化
    log4j重复打印的解决方法
    mysql 允许在唯一索引的字段中出现多个null值
    elasticsearch 常见查询及聚合的JAVA API
    A记录(主机名解析)、CNAME(别名解析)和URL转发(域名转发)
    域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5436812.html
Copyright © 2011-2022 走看看