策略模式
系统分析:
车类:自行车,电动车,小车,跑车,玩具车,公交车,大货车等等;
相同行为:能行驶,发声音,不同行为:行驶方式,发声方式不同
相同属性:都有名字
车类 | 方式 | 车类 | 方式 |
---|---|---|---|
自行车 | foot | 电动车 | 电 |
小车 | 95号汽油 | 跑车 | 98号汽油 |
玩具车 | 机械(转动)行驶 | 公交车 | 电、90汽油 |
大货车 | 煤油 |
等等 需要支持横向扩展
发声音:
车类 | 声音类型 | 车类 | 声音类型 |
---|---|---|---|
自行车 | 没有声音 | 电动车 | baba |
小车 | didi | 跑车 | didibaba |
玩具车 | gaga | 公交车 | wuwu |
大货车 | wongwong |
-
原则1:把变化的封装起来,和不变的区分开;
-
原则2:多用组合,少用继承
-
原则3:针对接口编程,不针对实现编程;
大致目录如下:
行为:类
public interface RunBehavior
{
void run();
}
98号汽油:
public class NineEightGasolineRun implements RunBehavior {
bus类:
public class Bus extends Car {
public Bus(){
voiceBehavior=new WuWuVoice();
runBehavior=new ElectricRun();
}
测试类:车类测试,这个时候车就没有办法行驶了
public class TestCar {
public static void main(String[] args) {
// 汽车
Bus bus=new Bus();
bus.voice(); // 当前使用的wuwu声音
bus.run(); // 采用的电力行车
System.out.println("Electricity is used up"); //电力用完了的时候
// 这个时候就停车了
bus.run();// 采用了汽油行驶
}
}
实现2:
前面实现都一样 不一样的是car里面多了设置接口的方法
**
* 策略模式:
* 1.把变的类:runBehavior voiceBehavior进行委托给行驶类,和声音类来完成了。把变化的封装起来,和不变的区分开
* 2.多用组合,少用继承;runBehavior voiceBehavior 也是这2个行为组合起来成了车的部分条件;但是他们行为有多种类型,想用什么都可以随时改变的话需要动态的注入接口
* 3.针对接口编程,不针对实现编程;如果是实现的话,申明一个Car类(voice run 方法),不同车重写父类方法都能实现了。但是这样代码冗余量太多了
* 针对父类编程==》针对接口编程 骚等完善
*/
public abstract class Car {
RunBehavior runBehavior; // 行驶的方式不同
VoiceBehavior voiceBehavior; // 喇叭声音不一样
public abstract void name();// 抽象出公共的名字 让每一个继承的类都实现公共的方法而且这个方法是都有的名字不一样
public void voice() {
voiceBehavior.voice();
}
/**
* 此方法采用构造方法注入接口的方式让车可以动态的修改它的奔跑的方法:
* 公交车:电和汽油混合的行动方法,当电用完的时候就可以采用其他的方式.
* @param v
*/
public void setVoiceBehavior(RunBehavior v){
runBehavior=v;
};
public void run() {
runBehavior.run();
}
}
测试方法:
public class TestCar {
public static void main(String[] args) {
// 汽车
Bus bus=new Bus();
bus.voice(); // 当前使用的wuwu声音
bus.run(); // 采用的电力行车
System.out.println("Electricity is used up"); //电力用完了的时候
bus.setVoiceBehavior(new NineFiveGasolineRun()); // 动态的改变行驶方式
bus.run();// 采用了汽油行驶
}
}