目录
    
   
    1、基本介绍
   
- 
     开闭原则(Open Closed Principle)是编程中
 
 最基础、最重要
 
 的设计原则。
- 
     一个软件实体如:类、模块和函数,应该
 
 
 对扩展开放
 
 
 (对提供方来说),
 
 
 对修改关闭
 
 
 (对使用方来说)。
 
 
 用抽象构建框架,用实现扩展细节
 
 。
 
- 
     当软件需要变化时,尽量
 
 通过扩展
 
 软件实体的行为来实现变化,而不是
 
 通过修改
 
 已有的代码来实现变化。
- 
     编程中遵循其他原则,以及使用设计模式的目的就是遵循
 
 开闭原则
 
 (核心)。
    2、应用实例
   
    2.1、需求
   
有一个制门的加工厂,可以生产玻璃门、木门、铁门等门。
编程实现生产细节。
    2.2、传统方式实现
   
    2.2.1、问题分析
   
每个门可以设计为一个类,用一个属性type来区分是什么门。
加工厂也是一个类,加工厂中更据type来制作不同的门。
    2.2.2、类图
   
     
   
    2.2.3、代码
   
/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        DoorFactory factory = new DoorFactory();
        factory.makeDoor(new IronDoor());
        factory.makeDoor(new TimberDoor());
    }
}
/**
 * 门
 */
class Door{
    int type;
}
/**
 * 铁门
 */
class IronDoor extends Door{
    public IronDoor() {
        type = 1;
    }
}
/**
 * 木门
 */
class TimberDoor extends Door{
    public TimberDoor(){
        type = 2;
    }
}
/**
 * 制门工厂
 */
class DoorFactory{
    /**
     * 制作门
     */
    public void makeDoor(Door door){
        if(1 == door.type){
            makeIronDoor();
        }else if(2 == door.type){
            makeTimberDoor();
        }
    }
    public void makeTimberDoor(){
        System.out.println("制作木门");
    }
    public void makeIronDoor(){
        System.out.println("制作铁门");
    }
}
运行结果:
     
   
    2.2.4、传统方式实现分析
   
这种方式达到了需求,但是扩展性不好。
比如:现在要制门工厂生产玻璃门,那该怎么做呢?
- 首先要新建一个玻璃门类。
- 然后再制门工厂中加入制作玻璃门的方法。
- 最后要修改制门工厂中的制作门方法,在方法中添加if-else来判断玻璃门。
    问题就来了,我们在新加入一种或者减少一种门的时候,都要去修改制门工厂类,这严重违反了
    
     
      开闭原则(OCP)
     
     。
    
   
解决方式:将具体实现交给实现层(类),引用的时候使用抽象层(接口/抽象类)
    2.3、遵循开闭原则实现
   
    2.3.1、问题分析
   
将门设计成一个抽象类或者接口,提供一个抽象方法:制作;
具体的各个门(木门、铁门…)实现或继承门;
制门工厂中不用考虑要制作什么门,只需要调用制门方法即可,具体细节让门的实例自己去实现;
    2.3.2、类图
   
     
   
    2.3.3、代码
   
/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        DoorFactory factory = new DoorFactory();
        factory.makeDoor(new IronDoor());
        factory.makeDoor(new TimberDoor());
    }
}
/**
 * 门
 */
interface Door{
    void make();
}
/**
 * 铁门
 */
class IronDoor implements Door{
    @Override
    public void make() {
        System.out.println("制作铁门");
    }
}
/**
 * 木门
 */
class TimberDoor implements Door{
    @Override
    public void make() {
        System.out.println("制作木门");
    }
}
/**
 * 制门工厂
 */
class DoorFactory{
    /**
     * 制作门
     */
    public void makeDoor(Door door){
        door.make();
    }
}运行结果与上面一种方式的一样。
    2.3.4、遵循开闭原则实现分析
   
遵循开闭原则设计的程序,虽然运行起来和前面的方式一模一样,但是:遵循开闭原则,从根本上提高了程序的扩展性、维护性和可靠性。
如果现在要制作玻璃门,只需要在新增一个玻璃门类并实现Door的make方法即可,不用再做任何的修改。
    这也就是:
    
     对扩展
    
    (新增门)
    
     开放
    
    ,
    
     对修改
    
    (制门工厂)
    
     关闭。
    
   
 
