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     private CarFunction carFunction;//策略类
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 }

  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之类的应用场景,等等,举一反三,会发现生活中有很多的例子都是用到了策略模式。

时间: 2024-12-09 22:13:30

java23种设计模式之一: 策略模式的相关文章

二十三种设计模式[21] - 策略模式(Strategy Pattern)

前言 策略模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 定义一些列的算法,把它们一个个封装起来,并且使它们可相互替换.使得算法可以独立于使用它的客户而变化 ". 也就是说通过策略模式,我们能够将算法与其调用者分离成相对独立的个体,降低维护成本,使代码更加优雅. 场景 就拿数据的搜索来说,可以简单的分为模糊搜索和精确搜索.在开发这个功能时,可能会写出如下代码. public List<string> Search(stri

二十四种设计模式:策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. MessageModel using System; using System.Collections.Generic; using System.Text; na

23种设计模式之策略模式(Strategy)

策略模式是一种对象的行为型模式,定义一系列算法,并将每一个算法封装起来,并让它们可以相互替换.策略模式比算法独立于使用它的客户而变化,其目的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类. 优点: 1)另一种子类化方法. 2)在类自身中定义了每一个行为,这样就减少了条件语句. 3)更容易扩展模型.在不对应用程序进行代码修改的情况下,使该模式具有新的行为. 使用场景: 1)许多相关类只是在行为方面有所区别. 2)许多算法的不同变体. 3)算法使用客户端未知的数据. Strategy 模

23种设计模式之——策略模式

什么是策略模式? 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 什么时候去使用策略模式? 策略模式就是用来封装算法的,但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性. 适用的场景? 1.如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为. 2.一个系统需要动态地在几

java23种设计模式之一: 工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行. 主要解决:主要解决接口选择的问题. 何时使用:我们明确地计划不同条件下创建不同实例时. 如何解决:让其子类实现工厂接口,返回的

java23种设计模式之四:建造者模式

一.build 介绍 二.实现原理 通过访问静态内部的形式得到内部类,内部类通过有参方法将传入的参数赋值给静态内部类对象,外部类私有构造函数,参数设置成静态内部类对象当静态内部类对象通过无参的build方法获得外部类时,外部类构造函数需要传入静态内部类实例对象,此时,精彩的来了,因为通过访问静态内部的方法获得了内部类对象,而在调用build方法时需要传入内部类对象,而在外部类的私有构造中传入的是静态内部类对象,因此build方法之前全是静态内部类对象,而在build时,确将自己当成参数传入外部类

Java--23种设计模式之decorator模式

1:装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的功能.是在不必改变原类文件和不使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 趣味解释:DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(