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