开闭原则(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 }
测试结果:
结论:下次我增加了飞行员 等等其他类型的人,我直接增加子类就好,在子类中增加自己的方法,从而不用修改原有代码
这里面是个人理解,有书写错误的或者大家有更好更容易理解的可以提出来