java设计模式 策略

时间:2022-11-21 21:58:42

什么是策略设计模式?

  • 世界永远都在变,唯一不变的就是变本身
  • 举个生活中的例子,小时候玩的游戏中,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类中加一个属性变量来表示数据,然后在构造函数中直接赋值?这样写的话,就是很明显的数据流是从键盘流到电脑了,但好像又不太合适,就采用了这种写法
  • 原文出处