状态模式和适配器模式:优雅设计、扩展自如
2023-10-03 17:16:09
状态模式
状态模式是一种行为型设计模式,它允许对象在不同的状态之间切换,并且根据当前状态来改变其行为。状态模式的关键在于区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。
举个例子,考虑一个“电灯程序”。这个程序可以模拟一个电灯的开关状态,当用户点击“开”按钮时,电灯会亮起;当用户点击“关”按钮时,电灯会熄灭。我们可以使用状态模式来设计这个程序。
在这个程序中,电灯可以有两种状态:开和关。我们可以创建一个“电灯”类,并在其中定义两个方法:“开”和“关”。当电灯处于“开”状态时,调用“开”方法会使电灯保持原样;当电灯处于“关”状态时,调用“关”方法也会使电灯保持原样。
public class Light {
private State state;
public Light() {
this.state = new OffState();
}
public void turnOn() {
this.state.turnOn(this);
}
public void turnOff() {
this.state.turnOff(this);
}
public void setState(State state) {
this.state = state;
}
}
interface State {
void turnOn(Light light);
void turnOff(Light light);
}
class OnState implements State {
@Override
public void turnOn(Light light) {
System.out.println("The light is already on.");
}
@Override
public void turnOff(Light light) {
light.setState(new OffState());
System.out.println("The light is now off.");
}
}
class OffState implements State {
@Override
public void turnOn(Light light) {
light.setState(new OnState());
System.out.println("The light is now on.");
}
@Override
public void turnOff(Light light) {
System.out.println("The light is already off.");
}
}
通过使用状态模式,我们可以将电灯的开关状态与电灯的行为清晰地分离开来。这使得程序更容易维护和扩展。例如,如果我们想要添加一种新的电灯状态,比如“闪烁”,我们可以简单地创建一个新的“闪烁状态”类,而不必修改现有的代码。
适配器模式
适配器模式是一种结构型设计模式,它允许两个不兼容的接口相互协作。适配器模式的原理是创建一个“适配器”类,该类将一个接口转换成另一个接口。
举个例子,考虑一个“绘图程序”。这个程序可以绘制各种形状,比如圆形、正方形和三角形。我们想要在程序中添加一个新的形状,比如五角星。但是,五角星的绘制算法与其他形状的绘制算法不兼容。我们可以使用适配器模式来解决这个问题。
我们可以创建一个“五角星适配器”类,该类将五角星的绘制算法转换成绘图程序的接口。这样,绘图程序就可以通过五角星适配器来绘制五角星。
public class StarAdapter implements Shape {
private Star star;
public StarAdapter(Star star) {
this.star = star;
}
@Override
public void draw() {
star.draw();
}
}
public class DrawingProgram {
public void drawShape(Shape shape) {
shape.draw();
}
public static void main(String[] args) {
DrawingProgram program = new DrawingProgram();
program.drawShape(new Circle());
program.drawShape(new Square());
program.drawShape(new Triangle());
program.drawShape(new StarAdapter(new Star()));
}
}
通过使用适配器模式,我们可以将五角星的绘制算法与绘图程序的接口隔离开来。这使得程序更容易维护和扩展。例如,如果我们想要添加一种新的形状,比如六角星,我们可以简单地创建一个新的“六角星适配器”类,而不必修改现有的代码。
总结
状态模式和适配器模式是设计模式家族中的两颗璀璨明珠,它们在软件开发中有着广泛的应用。状态模式可以帮助我们优雅地处理对象状态的变化,而适配器模式可以帮助我们连接不兼容的接口。掌握这两种设计模式,你将成为一名更加优秀的软件工程师。