什么是策略设计模式?

  • 世界永远都在变,唯一不变的就是变本身
  • 举个生活中的例子,小时候玩的游戏中,Sony的PSP提供了统一的卡槽接口,玩家只要更换卡带就可以达到更换游戏的目的,做到了一机多用
  • 特工执行任务时针对不同的情况也有plan A, plan B, plan C
  • 话说有一个Computer类,一个USB接口,还有各种USB设备,故事就这样开始了。
  • Computer:“我上面装有一个USB接口,我只认识这个接口传递过来的数据,谁要跟我沟通你就去找它吧。”
  • USB:“要接驳我的设备是什么我不关心,但我规定设备必须有readData()这个方法,但是怎么实现我不管,总之你得通过这个方法把数据给我。”
  • Keyboard:“我有readData()这个方法,我已经实现好了,用户一敲键盘我就读过来传给你。 O(∩_∩)O。”
  • Mouse&Camera:“我也是,我也是,我要插!”
  • USB:“确实多态,够变态。”
  • 我们来看一下代码部分,接口部分
public interface USB {

    public void readData(String data);

}
  • 下面是三个不同设备鼠标,键盘,相机实现的不同读写数据的策略
public class Mouse implements USB {

    @Override
    public void readData(String data) {
        System.out.println("read data from mouse: " + data);
    }

}

public class Keyboard implements USB {

    @Override
    public void readData(String data) {
        System.out.println("read data from keyboard: " + data);
    }
}

public class Camera implements USB {

    @Override
    public void readData(String data) {
        System.out.println("read data from camera: " + data);
    }
}
  • 具体电脑该如何接入USB接口呢?
public class Computer {

    private  USB usb; // 拥有某种USB策略

    public void setUsb(USB usb) { // 接入某种规格的USB
        this.usb = usb;
    }

    public void read(String data) {
        this.usb.readData(data);
    }

}
  • 看下该如何来调用
class Client {

    public static void main(String[] args) {

        Computer computer = new Computer();
        computer.setUsb(new Keyboard());
        computer.read("ABC");

        computer.setUsb(new Mouse());
        computer.read("click");

        computer.setUsb(new Camera());
        computer.read("capture");
    }
}
  • 一开始写这个练习的时候,有点绕不过来,电脑通过USB接口来读键盘输入的字符,可是应该在哪里把数据传送给键盘呢?难道是在接口实现类Keyboard类中加一个属性变量来表示数据,然后在构造函数中直接赋值?这样写的话,就是很明显的数据流是从键盘流到电脑了,但好像又不太合适,就采用了这种写法
  • 原文出处

java设计模式 策略的更多相关文章

  1. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  2. JAVA 设计模式 策略模式

    用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构

  3. 我的Java设计模式-策略模式

    今天给大家说说田忌赛马的故事.如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的,其中赛马是最火爆的.一天,孙膑看到田忌像个死鸡似的就知道肯定赛马又输给了齐威王,立马 ...

  4. Java设计模式-策略模式详解

    前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...

  5. Java设计模式—策略模式

    1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下:     Define a family of algorithms,e ...

  6. Java 设计模式--策略模式,枚举+工厂方法实现

    如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...

  7. java设计模式--策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 本文地址:http:// ...

  8. Java设计模式-策略模式(strategy)

    策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户.需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无 ...

  9. Java设计模式——策略模式

    策略模式的定义: 策略模式其实特别好理解,俗话说得好,条条大路通罗马,做的都是一件事,实现的方式却可以千万种,在这种情况下,如何使得每个人都可以根据自己的喜好来选择具体的方式,在调用时可以根据不同方式 ...

随机推荐

  1. 实例甜点 Unreal Engine 4迷你教程(3)之用C++改变Image小部件的其它属性

    完成本迷你教程之前,请前往完成以下迷你教程: ·实例甜点 Unreal Engine 4迷你教程(2)之用C++改变Image小部件的颜色: 在上一次的迷你教程的LearnWidgets工程上进行(如 ...

  2. Build Assetbundle出错:An asset is marked as dont save, but is included in the build

    前天Build Assetbundle的时候出错了,导致打包失败,具体日志内容如下: An asset is marked as dont save, but is included in the b ...

  3. Julia - 变量

    变量的赋值 julia> a = 1 # 把 10 赋给变量 a 1 julia> a + 1 # 变量 a 的值加 1 2 julia> a = 4 # 重新赋值给变量 a 4 j ...

  4. 图灵机器人,web录音实现自动化交互问答

    一.图灵机器人 介绍 图灵机器人 是以语义技术为核心驱动力的人工智能公司,致力于“让机器理解世界”,产品服务包括机器人开放平台.机器人OS和场景方案. 官方地址为: http://www.tuling ...

  5. Android开发笔记 TableLayout常用的属性介绍

    今天看了安卓简单控件的布局方式,大概有绝对.相对.表格.线性.帧式布局五种方式,表格布局里面的一些属性相对来说比较复杂,下面主要谈谈表格方式布局的一些属性   TableLayout经常用到的属性有: ...

  6. webapi help文档 添加测试功能

    在做webapi项目的时候 webapi为我们提供了help文档,开发者可以参考这个文档,但是这个文档缺少测试功能,如果加上一个测试的功能就更加方便了 于是就研究了下写了一段代码,代码比较简单,只要将 ...

  7. 1 任务管理  --转载于电子工程世界

    uC/OS-II 中最多可以支持64 个任务,分别对应优先级0-63,其中0 为最高优先级.63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个. uC ...

  8. ThinkPHP5如何引用新建的配置文件?

    1.在Application文件夹下建立extra 文件夹,并把新建的配置文件(例如字典配置文件dictConfig.php等)放入此文件夹: 2.在代码中使用 Config::get("d ...

  9. File类的使用:遍历目录

  10. 基于C++11的线程池(threadpool),简洁且可以带任意多的参数

    咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...