- 案例:电视遥控器-->开机、关机、下个频道、上个频道、调高音量、调低音量、
- 条件:开机的状态下才能进行其他操作、关机之后只能操作开机、
- 我们理一理,如果要用if/else.每个操作之前还需要保存当前的状态是否是开关机。这样会让代码很冗余、也不方便修改。这个时候应该想到面向接口、二话不说。上代码、、
- 需要建立一个电视TV的基本操作的接口
TVState类
public interface TvState {
public void turnUp();
public void turnDown();
public void nextChannel();
public void prevCHannel();
}
- 需要建立一个电视TV的电源状态的接口
PowerState类
public interface PowerState {
public void powerON();
public void powerOFF();
}
- 电视TV开机的具体实现类(既然开机了,就能实现电视的基本操作)
TVPowerONState 类
public class TVPowerONState implements TvState {
@Override
public void turnUp() {
System.out.println("调高音量");
}
@Override
public void turnDown() {
System.out.println("调低音量");
}
@Override
public void nextChannel() {
System.out.println("下个频道");
}
@Override
public void prevCHannel() {
System.out.println("上个频道");
}
}
- 电视TV关机的具体实现类(既然关机了,就不用实现电视的基本操作)
TVPowerOFFState 类
public class TVPowerOFFState implements TvState {
@Override
public void turnUp() {
}
@Override
public void turnDown() {
}
@Override
public void nextChannel() {
}
@Override
public void prevCHannel() {
}
}
- 重点来了、那就是遥控器怎么去实现这些状态、
Controller 类
public class Controller implements PowerState {
public TvState mTvState;
public void setmTvState(TvState mTvState) {
this.mTvState = mTvState;
}
@Override
public void powerON() {
setmTvState(new TVPowerONState());
System.out.println("开机了!");
}
@Override
public void powerOFF() {
setmTvState(new TVPowerOFFState());
System.out.println("关机了!");
}
public void nextChannel() {
mTvState.nextChannel();
}
public void prevChanner() {
mTvState.prevCHannel();
}
public void trunUp() {
mTvState.turnUp();
}
public void trunDown() {
mTvState.turnDown();
}
}
如有错误请指出
既然是遥控器那它基于的就是开机还关机两种状态。故需要去实现PowerState接口、实现开机关机两个方法。但是我们的基本操作在TVSatate这个接口里啊。怎么办???
问题不大、直接面向接口。把接口当做对象传进来、然后全局的mTVState、反手就是一个set方法。这样在实现开机powerON()方法时候set(new TVPowerONState()).关机同理。这样mTVState就通过set方法将基本操作(开机、关机、下个频道、上个频道、调高音量、调低音量、)方法拿到。
然后就去实现下方法就行 so easy。
- 实现类
public class MyClass {
public static void main(String args[]) {
Controller controller = new Controller();
controller.powerON();
controller.trunUp();
controller.nextChannel();
controller.prevChanner();
controller.trunDown();
controller.powerOFF();
controller.trunDown();//这个执行没有结果。未对该方法实现具体操作
}
}
调试结果:
开机了!
调高音量
下个频道
上个频道
调低音量
关机了!