说明
某软件公司欲开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎急刹车时在路面上留下的不同痕迹,并考虑后续能模拟更多种轮胎急刹车时的痕迹。
现采用策略(Strategy)设计模式来实现该需求,其类图如下图所示。
Java代码
import java.util.*; //把util这个包下的全部类导入到程序中
//*表示的是通配符,包括util的所有类
//Car使用接口BrakeBehavior来调用LongWheelBrake和ShortWheelBrake定义的算法
interface BrakeBehavior { //定义算法的公共接口BrakeBehavior
public void stop();
/* 其余代码省略 */
}
class LongWheelBrake implements BrakeBehavior { //定义实现接口BrakeBehavior的类LongWheelBrake(长轮胎刹车)
public void stop() {
System.out.println("模拟长轮胎刹车痕迹!");
}
/* 其余代码省略 */
}
class ShortWheelBrake implements BrakeBehavior { //定义实现接口BrakeBehavior的类ShortWheelBrake(短轮胎刹车)
public void stop() {
System.out.println("模拟短轮胎刹车痕迹!");
}
/* 其余代码省略 */
}
//将Car与BrakeBehavior联系起来
abstract class Car { //定义抽象类Car,用于定义和维护对BrakeBehavior对象的引用
protected BrakeBehavior wheel; //定义刹车特征变量wheel
public void brake() {
wheel.stop(); //通过Car的变量wheel来调用BrakeBehavior所提供的公共接口stop
}
/* 其余代码省略 */
}
//依据策略对象来调用不同的策略算法
class ShortWheelCar extends Car { //定义子类ShortWheelCar,特征是短轮胎刹车
public ShortWheelCar(BrakeBehavior behavior) { //定义公有属性的同名构造方法ShortWheelCar
wheel = behavior; //构造方法是对类的构造,带参构造函数一般是对其父类的属性wheel进行参数赋值
}
/* 其余代码省略 */
}
class StrategyTest {
public static void main(String[] args) { //定义主方法(程序入口)
BrakeBehavior brake = new ShortWheelBrake(); //实例化ShortWheelBrake,赋值给brake变量
ShortWheelCar car1 = new ShortWheelCar(brake); //实例化ShortWheelCar,赋值给car1变量
car1.brake(); //通过StrategyTest的变量car1来调用ShortWheelCar继承父类Car的方法brake
}
}
注释
几点需要记住的:
- BrakeBehavior对应Strategy;
- LongWheelBrake、ShortWheelBrake对应ConcreteStrategy;
- Car对应Context;
- 抽象类不一定有抽象方法,有抽象方法的一定是抽象类;
- 抽象类需要子类去继承,即extends;
- 接口需要子类去实现,即implements,实现接口就要实现接口中的所有方法;
- 接口里的方法都是抽象类,abstract省略;
- protected表示受保护的,只有本类或子类或父类中可以访问;
- 枚举类自动添加public、static、final修饰;