楼子湾

导航

统计
 

开闭原则(Open Close Principle)

一、定义:

软件中的(类、模块、函数等等)应该对于扩展是开放的,对于修改时关闭的。意味着一个实体允许在不改变它的源代码的前提变更它的行为 

这里的软件包含一下几个部分:

1.项目中划分的模块

2.类与接口

3.方法

二、作用

使软件具有一定的适应性和灵活性的同时具备稳定性和延续性

1.对软件测试的影响

遵循开闭原则,只需要对扩展的代码进行测试,原有的测试 代码任然能够运行

2.提高代码复用性

粒度越小(功能越单一),越容易被复用。在面向对象的程序设计中,根据原子和抽象编程可以提高代码的复用性

3.提高软件的可维护性

遵循开闭原则的程序:稳定性高和延续性强,易于扩展和维护

三、开闭原则的实现方法

通过“抽象约束,封装变化”来实现开闭原则,即通过接口和抽象类为软件定义一个相对稳定的抽象层,而将相同的可变因素封装到相同的具体实现类中。

软件中稳定的用抽象或接口约束,易变的用实现类扩展

示例

定义成年人的行为:

固定的:吃饭 上班 睡觉 

易变的:玩游戏 开车 运动

 1 public interface Person {
 2     public void eat();
 3     public void sleep();
 4     public void work();
 5 }
 6 
 7 /**
 8  * 公交司机
 9  */
10 public class BusDriver implements Person {
11     private String name;
12 
13     public BusDriver(String name) {
14         this.name = name;
15     }
16 
17     @Override
18     public void eat() {
19         System.out.println(name + "在吃饭");
20     }
21 
22     @Override
23     public void sleep() {
24         System.out.println(name + "在睡觉");
25     }
26 
27     @Override
28     public void work() {
29         System.out.println(name + "在工作");
30     }
31 
32     /**
33      *  开公交车:公交司机独有的
34      */
35     public void drive(){
36         System.out.println(name + "在开公交车");
37     }
38 
39     public String getName() {
40         return name;
41     }
42 
43     public void setName(String name) {
44         this.name = name;
45     }
46 }
47 
48 /**
49  * 售票员
50  */
51 public class TicketSeller extends Person {
52 
53     public TicketSeller(String name) {
54         super(name);
55     }
56 
57     @Override
58     protected void eat() {
59         System.out.println(getName() + "在吃饭");
60     }
61 
62     @Override
63     protected void sleep() {
64         System.out.println(getName() + "在睡觉");
65     }
66 
67     @Override
68     protected void work() {
69         System.out.println(getName() + "在工作");
70     }
71 
72     /**
73      * 售票员独有的
74      */
75     public void sellTicket(){
76         System.out.println(getName() + "在买票");
77     }
78 }
79 测试:
80 public static void main(String[] args) {
81         BusDriver busDriver = new BusDriver("老王");
82         busDriver.eat();
83         busDriver.work();
84         busDriver.drive();
85         busDriver.sleep();
86         TicketSeller sellTicket = new TicketSeller("李小姐");
87         sellTicket.eat();
88         sellTicket.work();
89         sellTicket.sellTicket();
90         sellTicket.sleep();
91     }
View Code

测试结果:

 

 

结论:下次我增加了飞行员 等等其他类型的人,我直接增加子类就好,在子类中增加自己的方法,从而不用修改原有代码

 

这里面是个人理解,有书写错误的或者大家有更好更容易理解的可以提出来

posted on 2020-02-27 18:57  楼子湾  阅读(...)  评论(...编辑  收藏