设计模式之策略模式

Posted baoguochun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之策略模式相关的知识,希望对你有一定的参考价值。

一.应用背景
     在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。把一个类(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之类的应用场景,等等,举一反三,会发现生活中有很多的例子都是用到了策略模式。

  原链接https://www.cnblogs.com/V1haoge/p/6479118.html

以上是关于设计模式之策略模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式之策略模式

设计模式之策略模式

阿昌之丑陋代码优化通过策略模式&模版模式来优化Controller执行流程

设计模式之策略模式

设计模式之策略模式

Javascript设计模式总结之 -- 策略模式