设计模式之__开闭原则

Posted 一起写程序

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之__开闭原则相关的知识,希望对你有一定的参考价值。


问题1)开闭原则,最基层的原则。

开闭原则一个软件实体如类,模块,函数应该对扩展开发,对修改关闭(只扩展不修改)对修改行为的约束。

 

开闭原则的实现方法:面向抽象编程,对业务进行抽象,写的都是抽象方法或者类。(不去修改原有的,不写具体的实现,而是在欲言又止的基础上进行添加或实现。)

 

优点:高复用和易维护。

 

问题2)为什么开闭原则只扩展,不修改呢?

只扩展不修改。(越基层的影响越大,越表层的影响越小)

修改原来接口,就得修改所有继承该接口的类,失去了接口规范的作用,并且非常复杂。

修改原来的类,如果该类非常复杂,并且如果有其他类使用,修改复杂而且可能发生错误。

问题3)开闭原则coding

* 业务需求:现在业务扩展,要对Java课程price进行打折。
* 开闭原则:不能修改原来的类和接口。ICourse接口和javaCourse类

 

 

/**
 * 业务需求:现在业务扩展,要对Java课程price进行打折。
 * 开闭原则:不能修改原来的类和接口。
 *
 * 版本1,可以在接口中添加打折方法discountCourse()。让JavaCourse方法实现。
 * 这样虽然实现了,既能获取原价,又能获取打折价。但如果继承Icourse接口的课程很多。就需要一个个的实现类进行修改。也失去了接口的规范功能。
 *
 
* 版本2,如果在JavaCourse类中直接对getPrice * 0.8。也可以进行打折。
*          但是原价的获取方法就没有了。
并且可能该类很复杂,如果直接在原来的类中修改。
*          可能引起错误。
 * 版本3,本着开闭原则,只扩展,不修改。可以写一个javaDisCourse类继承javaCourse类。
 * 在javaDisCourse方法中添加打折方法。这样就遵循开闭原则。原来的ICourse接口和javaCourse类都没有修改。
 *
 * 注意:引用类型iCourse只调用实现类的继承的方法。不会调用实现类非继承方法。
 * 如果想调用实现类非继承方法,就需要进行强制转换。
 */

public class test {
   
public static void main(String[] args) {
//        ICourse iCourse = new javaCourse(123,"java课程",350d);
       
ICourse iCourse = new JavaDiscountCourse(123,"java课程",350d);
       
JavaDiscountCourse javacourse = (JavaDiscountCourse)iCourse;
       
System.out.println("课程id:"+javacourse.getId()+课程名:"+javacourse.getName()+打折课程价格"+javacourse.getPrice()+原来的价格"+javacourse.getOrignPrice());
   
}
}

 

原来的类结构图:


开闭原则之后的类结构图:


实例:

课程接口

public interface ICourse {
   
//课程id,名称,价格
   
Integer getId();
   
String getName();
   
Double getPrice();
}

java课程实现课程接口。

public class javaCourse implements ICourse {
   
int id;
   
String name;
   
Double price;

    public
javaCourse(int id, String name, Double price) {
       
this.id = id;
        this
.name = name;
        this
.price = price;
   
}

   
public Integer getId() {
       
return this.id;
   
}

   
public String getName() {
       
return this.name;
   
}

   
public Double getPrice() {
       
return this.price;
   
}
}

 

java打折课程实现类,继承java课程

public class JavaDiscountCourse extends javaCourse {
   
public JavaDiscountCourse(int id, String name, Double price) {
       
super(id, name, price);
   
}

   
public Double getOrignPrice(){
       
return super.getPrice();
   
}
   
@Override
   
public Double getPrice() {
       
return super.getPrice()*0.8;
   
}

}


以上是关于设计模式之__开闭原则的主要内容,如果未能解决你的问题,请参考以下文章

面向对象之开闭原则

扎实基础_设计模式之六大原则,及其模式总结

设计模式系列之七大原则之——开闭原则

设计原则之开闭原则Open Close Principle

面向对象设计原则之开闭原则

前端用到的设计模式之开闭原则. 里氏代换原则