zoukankan      html  css  js  c++  java
  • java23种设计模式之一: 策略模式

      由于最近在研究学习设计模式,我会用自己的理解方式来表述对设计模式的学习和认识,通过最常用、好记的案例来记住和使用设计模式,希望对设计代码方面有所提高和改进。

    一.应用背景
         在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。把一个类(A)中经常改变或者将来可能改变的部分提取出来,作为一个接口(B),然后在类(A)中包含这个接口(B),这样类(A)的实例在运行时就可以随意调用实现了这个接口的类(C)的行为。比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。

    二.优、缺点

      优点:
        1、可以动态的改变对象的行为
      缺点:
        1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
        2、策略模式将造成产生很多策略类

    三.组成

      1.运行环境类:Strategy

        这个策略模式运行的环境,其实也就是在哪里使用

      2.应用场景类:Person

        这个就是客户端访问的类,也就是该类的对象所持有的策略

      3具体策略类:Car

        具体实现策略类

      4..抽象策略类:CarFunction

        根据不同的需求,产生不同的策略或算法的接口

    四.代码实现

      1.抽象策略类:CarFunction

     1 package com.design.strategy;
     2 /**
     3 * @ClassName   : CarFunction 
     4 * @Description : 策略类 
     5 *
     6 */
     7 
     8 public interface CarFunction {
     9     void run();        //每辆车有不同的行驶方法
    10 }

      2.具体策略父类

     1 package com.design.strategy;
     2 /**
     3  * 
     4  * @ClassName   : Car 
     5  * @Description : 每个车都具有的相同的属性和行为
     6  *
     7  */
     8 public class Car implements CarFunction {
     9     protected String name;            //车名字
    10     protected String color;            //车颜色
    11    
    12     
    13     public Car(String name, String color) {
    14         this.name = name;
    15         this.color = color;
    16     }
    17 
    18     @Override
    19     public void run() {
    20         System.out.println(color +" " + name  +"在行驶。。。");
    21     }
    22     
    23 }

      3.具体策略实现子类

     1 package com.design.strategy;
     2 /**
     3  * 
     4  * @ClassName   : SmallCar 
     5  * @Description : 具体策略实现子类
     6  *
     7  */
     8 public class SmallCar extends Car {
     9 
    10     public SmallCar(String name, String color) {
    11         super(name, color);
    12     }
    13     
    14     public void run() {
    15         System.out.println(color +" " + name  +"在高速的行驶。。。");
    16     }
    17     
    18 }
     1 package com.design.strategy;
     2 
     3 public class BussCar extends Car{
     4 
     5     public BussCar(String name, String color) {
     6         super(name, color);
     7     }
     8     
     9     public void run() {
    10         System.out.println(color +" " + name  +"在缓慢的行驶。。。");
    11     }
    12 }

     4.应用场景类

     1 package com.design.strategy;
     2 /**
     3  * 
     4  * @ClassName   : Person 
     5  * @Description : 应用场景类
     6  *
     7  */
     8 public class Person {
     9     private String name;    //姓名
    10     private Integer age;    //年龄
    11     private Car car;        //拥有车
    12     
    13     public void driver(Car car){
    14         System.out.print(name +"  "+ age+" 岁 "+" 开着");
    15         car.run();
    16     }
    17 
    18     public Person(String name,Integer age) {
    19         this.name=name;
    20         this.age=age;
    21     }
    22 
    23 }

      5.运行环境类:Strategy

     1 package com.design.strategy;
     2 /**
     3  * 
     4  * @ClassName   : Strategy 
     5  * @Description : 运行环境类:Strategy    
     6  * @date        : 2017年12月9日 上午11:43:58
     7  *
     8  */
     9 public class Strategy {
    10     public static void main(String[] args) {
    11         Car smallCar = new SmallCar("路虎","黑色");
    12         Car bussCar = new BussCar("公交车","白色");
    13         Person p1 = new Person("小明", 20);
    14         p1.driver(smallCar);
    15         p1.driver(bussCar);
    16     }
    17 }
    18 
    19 运行结果:
    20 小明  20 岁  开着黑色 路虎在高速的行驶。。。
    21 小明  20 岁  开着白色 公交车在缓慢的行驶。。。

    五.总结

      策略模式可以理解为老司机开车,但是他今天想到路虎,明天想开奔驰。。。,针对他不同的需求,来产生不同的应对策略,好记一点就是:老司机开车!!! 哈哈。。。

    六.延伸  

      同样也可以延伸到商家搞活动,消费多少元减50之类的应用场景,等等,举一反三,会发现生活中有很多的例子都是用到了策略模式。

  • 相关阅读:
    递增三元子序列
    Linux sed 命令
    linux shell中$0,$?,$!等的特殊用法
    ansible-playbook使用
    Linux下通过crontab命令来实现定时任务
    iperf网络性能测试
    OpenStack接口测试工具rally/tempest环境搭建及使用
    Jenkins配置slaver节点
    微信小程序跳转外部链接(h5页面)以及数据交互
    Echarts 系列之折线图、柱状图相关配置
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/8000421.html
Copyright © 2011-2022 走看看