返回

状态模式和适配器模式:优雅设计、扩展自如

前端

状态模式

状态模式是一种行为型设计模式,它允许对象在不同的状态之间切换,并且根据当前状态来改变其行为。状态模式的关键在于区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。

举个例子,考虑一个“电灯程序”。这个程序可以模拟一个电灯的开关状态,当用户点击“开”按钮时,电灯会亮起;当用户点击“关”按钮时,电灯会熄灭。我们可以使用状态模式来设计这个程序。

在这个程序中,电灯可以有两种状态:开和关。我们可以创建一个“电灯”类,并在其中定义两个方法:“开”和“关”。当电灯处于“开”状态时,调用“开”方法会使电灯保持原样;当电灯处于“关”状态时,调用“关”方法也会使电灯保持原样。

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()));
    }

}

通过使用适配器模式,我们可以将五角星的绘制算法与绘图程序的接口隔离开来。这使得程序更容易维护和扩展。例如,如果我们想要添加一种新的形状,比如六角星,我们可以简单地创建一个新的“六角星适配器”类,而不必修改现有的代码。

总结

状态模式和适配器模式是设计模式家族中的两颗璀璨明珠,它们在软件开发中有着广泛的应用。状态模式可以帮助我们优雅地处理对象状态的变化,而适配器模式可以帮助我们连接不兼容的接口。掌握这两种设计模式,你将成为一名更加优秀的软件工程师。