六大设计原则 - 开闭原则【Open Close Principle】

简介: 六大设计原则 - 开闭原则【Open Close Principle】

六大设计原则

  • 单一职责原则
  • 里式替换原则
  • 依赖倒置原则
  • 接口隔离原则
  • 迪米特原则
  • 开闭原则

开闭原则

定义: Software entities like classes, modules and functions should be open for extension but closed for modifications. 一个软件实体应该对扩展开放,对修改关闭。

定义解析:一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。

  • 软实体包括
1.项目或软件产品中按照一个的逻辑规则划分的模块 
2.抽象或类 
3.方法 

举例:

IBook 是定义了数据的三个属性:名称、价格和作者,小说类 NovelBook 是一个具体的实现类,所有小说书籍的总称,BookStore 指的是书店。

代码:

public class BookStore { 
    private final static ArrayList<IBook> bookList = new ArrayList<IBook>(); 
   //静态模块初始化,项目中一般是从持久层初始化产生
  static{ 
           bookList.add(new NovelBook("天龙八部",3200,"金庸")); 
           bookList.add(new NovelBook("巴黎圣母院",5600,"雨果")); 
           bookList.add(new NovelBook("悲惨世界",3500,"雨果")); 
           bookList.add(new NovelBook("金瓶梅",4300,"兰陵笑笑生")); 
 } 
//模拟书店买书
public static void main(String[] args) { 
         NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
         formatter.setMaximumFractionDigits(2); 
        for(IBook book:bookList){ 
             System.out.println("书籍名称:" + 
             book.getName()+
             "\t书籍作者:" + 
             book.getAuthor()+ 
             "\t书籍价格:" + 
             formatter.format(book.getPrice()/100.0)+
             "元"); 
         } 
  } 
} 

引入问题:书店为了生存开始打折销售:所有 40 元以上的书籍 9 折销售,其他的 8 折销售。对已经投产的项目来说,这就是一个变化,我们来看看这样的一个需求变化,我们该怎么去应对,有三种方法可以解决这个问题:

1、修改接口。
2、修改实现类。
3、通过扩展实现。

根据开闭原则,第3种为最优方案(废话也不想多说,自己分析,不懂看《设计模式之禅》)

修改后:

public class BookStore { 
    private final static ArrayList<IBook> bookList = new ArrayList<IBook>(); 
//静态模块初始化,项目中一般是从持久层初始化产生
static{ 
 bookList.add(new OffNovelBook("天龙八部",3200,"金庸")); 
 bookList.add(new OffNovelBook("巴黎圣母院",5600,"雨果")); 
 bookList.add(new OffNovelBook("悲惨世界",3500,"雨果")); 
 bookList.add(new OffNovelBook("金瓶梅",4300,"兰陵笑笑生")); 
} 
//模拟书店买书
public static void main(String[] args) { 
 NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
 formatter.setMaximumFractionDigits(2); 
 for(IBook book:bookList){ 
 System.out.println("书籍名称:" +
  book.getName()+
  "\t书籍作者:" + 
book.getAuthor()+
 "\t书籍价格:" + formatter.format(book.getPrice()/100.0)+"元"); } 
} 

修改后的描述:

只修改了static静态模块域,其他的部分没有任何改动。这部分确实修改了,该部分属于高层次的模块,是由持久层产生的,在业务规则改变的情况下高层模块必须有部分改变以适应新业务,改变时尽量的少,压制变化风险的扩散。

为什么使用开闭原则?

很理论的东西,自己琢磨,此处不做详述:
1.开闭原则对测试的影响
2.开闭原则可以提高复
3.开闭原则可以提高可维
4.面向对象开发的要求

开闭原则的使用姿势:

1.抽象约束
2.参数控制模块行为(参数控制程序的行为)
3.制定项目章程
4.封装(一是对相同的变化封装到一个接口或抽象类中,二是对不同的变化封装到不同的接口或抽象类中,不应该出现两个不同的变化出现同一个接口或抽象类中)

六大设计模式在本文已经简要描述完,最后来个装逼式的总结:

“编码的时候不要被设计模式禁锢思维,同时要使用设计模式约束思维。”



目录
相关文章
|
Java
六大设计原则-里式替换原则【Liskov Substitution Principle】
六大设计原则-里式替换原则【Liskov Substitution Principle】
43 0
|
运维 关系型数据库 Java
软件设计原则(02)-开闭原则(Open Close Principle,OCP)
软件设计原则(02)-开闭原则(Open Close Principle,OCP)
69 0
六大设计原则-接口隔离原则【Interface Segregation Principle】
六大设计原则-接口隔离原则【Interface Segregation Principle】
48 0
六大设计原则-单一职责原则【Single Responsibility Principle】
六大设计原则-单一职责原则【Single Responsibility Principle】
50 0
|
设计模式 人工智能 前端开发
软件架构设计原则之开闭原则
开闭原则(Open-Closed Principle,OCP)是指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定、灵活的系统。例如版本更新,我们尽可能不修改源代码,但是可以增加新功能。
136 0
软件架构设计原则--里氏替换原则
本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删
软件架构设计原则--里氏替换原则
软件架构设计原则--依赖倒置原则
本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删
软件架构设计原则--依赖倒置原则
|
数据安全/隐私保护
软件架构设计原则--单一职责原则
> 本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删
软件架构设计原则--单一职责原则
开闭原则|设计原则(二)
由于在软件体系中,唯一不变的,就是软件一直在变。
|
设计模式 测试技术
开闭原则|设计原则(一)
由于在软件体系中,唯一不变的,就是软件一直在变。