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

一.应用背景
     在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。把一个类(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.具体策略父类

 package com.design.strategy;
/**
*
* @ClassName : Car
* @Description : 每个车都具有的相同的属性和行为
*
*/
public class Car implements CarFunction {
protected String name; //车名字
protected String color; //车颜色 public Car(String name, String color) {
this.name = name;
this.color = color;
} @Override
public void run() {
System.out.println(color +" " + name +"在行驶。。。");
} }

  3.具体策略实现子类

 package com.design.strategy;
/**
*
* @ClassName : SmallCar
* @Description : 具体策略实现子类
*
*/
public class SmallCar extends Car { public SmallCar(String name, String color) {
super(name, color);
} public void run() {
System.out.println(color +" " + name +"在高速的行驶。。。");
} }
 package com.design.strategy;

 public class BussCar extends Car{

     public BussCar(String name, String color) {
super(name, color);
} public void run() {
System.out.println(color +" " + name +"在缓慢的行驶。。。");
}
}

 4.应用场景类

 package com.design.strategy;
/**
*
* @ClassName : Person
* @Description : 应用场景类
*
*/
public class Person {
private String name; //姓名
private Integer age; //年龄
private Car car; //拥有车 public void driver(Car car){
System.out.print(name +" "+ age+" 岁 "+" 开着");
car.run();
} public Person(String name,Integer age) {
this.name=name;
this.age=age;
} }

  5.运行环境类:Strategy

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

五.总结

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

六.延伸  

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

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

  1. java23种设计模式之: 策略模式,观察者模式

    策略模式  --老司机开车,但是他今天想到路虎,明天想开奔驰...针对他不同的需求,来产生不同的应对策略    策略类是一个接口,定义了一个大概的方法,而实现具体的策略则是由实现类完成的,这样的目的是 ...

  2. 【Unity3D与23种设计模式】策略模式(Strategy)

    GoF中定义: "定义一组算法,并封装每个算法,让它们之间可以彼此交换使用. 策略模式让这些算法在客户端使用它们时能更加独立." 游戏开发过程中 不同的角色会有不同的属性计算方法 ...

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

    策略模式是一种对象的行为型模式,定义一系列算法,并将每一个算法封装起来,并让它们可以相互替换.策略模式比算法独立于使用它的客户而变化,其目的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类. ...

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

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

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

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...

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

    在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名.性别.年龄 ...

  7. java23种设计模式之一: 代理模式(动态代理)

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  8. java23种设计模式之五:代理模式

    一.代理模式介绍 代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程 其中代理又分为:静态代理和动态代理 静态代理:指的是自己要写一个代理类,或者用工具生 ...

  9. python设计模式之策略模式

    每次看到项目中存在大量的if else代码时,都会心生一丝不安全感. 特别是产品给的需求需要添加或者更改一种if条件时,生怕会因为自己的疏忽而使代码天崩地裂,哈哈,本文的目的就是来解决这种不安全感的, ...

随机推荐

  1. weka数据挖掘拾遗(二)---- 特征选择(IG、chi-square)

    一.说明 IG是information gain 的缩写,中文名称是信息增益,是选择特征的一个很有效的方法(特别是在使用svm分类时).这里不做详细介绍,有兴趣的可以googling一下. chi-s ...

  2. JAVA 实现XML与JSON 相互转换

    原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,经常碰到XML转为JSON或者JSON转为XML,在这过程中有时嵌 ...

  3. jmeter 读取excel数据

    jmeter 读取excel数据使用的方法是使用Jmeter CSV Data Set Config参数化 但是将excel文件保存成csv格式后,jmeter读取后返回的数据总是出现乱码问题, 以下 ...

  4. phper

    0 坚持写博客,有独立的博客1 有自己的github项目,目前致力于瓦力:meolu/walle-web · GitHub,瓦尔登:meolu/walden · GitHub变得更实用,欢迎标星:)2 ...

  5. js数组之迭代器方法

    迭代器方法:对数组中的每一个元素应用一个函数,可以返回一个值,一组值或者一个新的数组.说的什么啊这是,根本听不懂.实践 不生成新数组的迭代器的方法: <html> <head> ...

  6. GCC编译器ABI

    ABI与EABI 1)ABI(Application Binary Interface for the ARM Architecture),描述了应用程序与cpu内核的低级接口. ABI允许编译好的目 ...

  7. 209. Minimum Size Subarray Sum(双指针)

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

  8. owl.carousel

    简介 Owl Carousel 是一个强大.实用但小巧的 jQuery 幻灯片插件,它具有一下特点: 兼容所有浏览器 支持响应式 支持 CSS3 过度 支持触摸事件 支持 JSON 及自定义 JSON ...

  9. linux常用命令:Linux 目录结构

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  10. 教你如何用Nginx搭建一个安全的、快速的微服务架构

    今天我们要谈论微服务以及如何使用Nginx构建一个快速的.安全的网络系统.最后,我们将向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo. 在我们探讨Fabric模式之前,我 ...