设计一个发电机类,发电方式多种多样,比如水力发电,火力发电,之后还会使用新技术,出现各种各样的发电方式。

/**
 * 虚拟发电机类
 */

@Data
public abstract class ElectricGenerator {
    /**
     * 将发电机固定的参数写到类中,特有的参数写到子类中
     */
    //发电功率
    private int rate;

    //发电方式,这里是关键,将发电方式外化,只要实现了这个接口的类,都可以成为发电方式。
    private ElectricGenerateWay electricGenerateWay;

    //发电功能是调用 发电方式接口类的发电方法
    void generateElectric() {
        electricGenerateWay.generateElectric();
    }

    //设置发电方式
    void setElectricGenerateWay(ElectricGenerateWay electricGenerateWay) {
        this.electricGenerateWay = electricGenerateWay;
    }
}

/**
 * 发电方式接口
 */
public interface ElectricGenerateWay {
    void generateElectric();
}

之后,我们增加一种发电机,使用风力发电,此时,就不需要修改原有的代码,而只需要增加代码就可以了(开闭原则:对于扩展是开放的,但是对于修改是封闭的

/**
 * 风力发电机类
 */
@Data
public class WindElectricGenerator extends ElectricGenerator {
    //假如风力发电机有扇叶数量的参数(风力发电机的特有参数写到子类中)
    private int flabellum;
}
/**
 * 风力发电方式
 */
public class WindElectricGenerateWay implements ElectricGenerateWay {
    public void generateElectric() {
        System.out.println("风力发电方式");
    }
}

/**
 * 使用风力发电机发电
 * 如果增加其他发电类型,比如水力发电,可以直接增加一个水力发电机和一个水力发电方式类。
 */
public class Demo {
    public static void main(String[] args) {
        ElectricGenerator electricGenerator = new WindElectricGenerator();
        //设置使用风力发电方式
        electricGenerator.setElectricGenerateWay(new WindElectricGenerateWay());

        electricGenerator.generateElectric();
    }
}