开闭原则——面向对象程序设计原则

目录

  • 前言
  • 开闭原则定义
  • 开闭原则作用
  • 开闭原则案例
    • 1. 描述
    • 2. uml 图
    • 3. 具体代码

前言

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。我们将在下面的几节中依次来介绍这 7 条原则,本节首先介绍开闭原则。

开闭原则定义

开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。

我们通常在程序设计中利用接口、抽象类、继承和实现等方式来体现开闭原则。

开闭原则作用

开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性。具体来说,其作用如下

  1. 对软件测试的影响
    软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
  2. 可以提高代码的可复用性
    粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
  3. 可以提高软件的可扩展性和可维护性
    遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。

开闭原则案例

1. 描述

我们设计图书接口、电子书接口、以及SSM电子书类和美食书籍类。电子书接口通过继承图书接口,对其进行了扩展,增加了getSize()方法,即获取电子书内存大大小。SSM电子书类通过实现电子书接口进一步扩展,增加了SSMComtent方法。美食书籍类通过实现图书接口,同样实现了扩展的方法。

以后如果我们有了更多的武侠类、游戏类……等书籍,不需要对原来的图书接口进行修改,只需要继承完成扩展即可。

2. uml 图


3. 具体代码

图书接口

import java.util.Date;

/**
 * 图书接口
 * 价格、书名、出版日期
 */
public interface IBook {
    double getPrince();
    String getName();
    Date publishDate();
}

电子书接口,扩展了一个方法获取电子书所占大小的方法。

/**
 * 电子书接口
 */
public interface IComputerBook extends IBook{
    /**
     * 获取电子书大小 16kb
     * */
    String getSize();
}

实现图书接口实现扩展。

import java.util.Date;

public class FoodBook implements IBook{

    private String name;
    private double price;
    private Date publishDate;

    public FoodBook(String name, double price, Date publishDate) {
        this.name = name;
        this.price = price;
        this.publishDate = publishDate;
    }

    @Override
    public double getPrince() {
        return price;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public Date publishDate() {
        return publishDate;
    }

    public void foodContent() {
        System.out.println("美食书籍: " + name + "-内容丰富哦!仅需要" + price +"元");
    }
}

实现电子书接口实现扩展。

import java.util.Date;
public class SSMBook implements IComputerBook {

    private String name;
    private double price;
    private Date publishDate;
    private String size;
    private String author;

    public SSMBook(String name, double price, Date publishDate, String size, String author) {
        this.name = name;
        this.price = price;
        this.publishDate = publishDate;
        this.size = size;
        this.author = author;
    }

    @Override
    public String getSize() {
        return size;
    }

    @Override
    public double getPrince() {
        return price;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public Date publishDate() {
        return publishDate;
    }

    public void SSMComtent() {
        System.out.println("SSM架构实战书籍:" + name + "-作者:" + author);
    }
}

测试类

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        FoodBook foodBook = new FoodBook("厨房秘籍", 30.00, new Date());
        showBookConten(foodBook);

        SSMBook ssmBook = new SSMBook("ssm架构", 57.20, new Date(), "20MB", "anben");
        showBookConten(ssmBook);
    }

    private static void showBookConten(IBook iBook) {
        if (iBook instanceof IComputerBook) {
            SSMBook ssmBook = (SSMBook) iBook;
            ssmBook.SSMComtent();
        } else {
            FoodBook foodBook = (FoodBook) iBook;
            foodBook.foodContent();
        }
    }
}

测试结果

美食书籍: 厨房秘籍-内容丰富哦!仅需要30.0元
SSM架构实战书籍:ssm架构-作者:anben

原文地址:https://www.cnblogs.com/haixiang/p/11107859.html

时间: 2024-10-10 04:48:13

开闭原则——面向对象程序设计原则的相关文章

里式替换原则——面向对象程序设计原则

目录 定义 意义 做法 实践 uml图 代码部分 github仓库 定义 Liskov于1987年提出了一个关于继承的原则"Inheritance should ensure that any property proved about supertype objects also holds for subtype objects."-- 继承必须确保超类所拥有的性质在子类中仍然成立..通俗的来讲就是子类可以扩展父类的功能,但是不能改变父类原有的功能. 该原则称为Liskov Sub

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

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本.我们将在下面的几节中依次来介绍这 7 条原则,本节首先介绍开闭原则. 开闭原则的定义 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作<面向对象软件构造>(Object Oriented Software Construction)中提出

依赖倒置原则——面向对象设计原则

依赖倒置原则的定义依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Robert C.Martin)于 1996 年在 C++ Report 上发表的文章. 依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象:抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should

面向对象程序设计原则

1.单一职则原则:一个类只有一个引起它变化的原因.说白了就是,一个类只有单一的一个功能,不同的类具备不同的职责,各施其责.如果一个类有多种职责,就应该分成多个类.2.开放封闭原则:对扩展开放,对修改关闭.如果需要增加功能,那么就扩展新类,而不是修改原来的类,所以在类设计时就要保证可以通过扩展的方式来添加新功能.3.里氏替换原则:在代码中可以将父类全部替换为子类,但程序不会报错.也就是父类的方法,在子类中全都有.反过来不一定行.4.接口隔离原则:一个类与另一个类之间的依赖性,应该依赖于尽可能小的接

面向对象设计原则,设计模式

面向对象设计原则之一:单一职责原则 面向对象设计原则之二:开放封闭原则 面向对象设计原则之三:里氏替换原则 面向对象设计原则之四:依赖倒置原则 面向对象设计原则之五:迪米特法则 Java之美[从菜鸟到高手演变]之设计模式 Java之美[从菜鸟到高手演变]之设计模式二

Python:面向对象的“开闭原则”和“鸭子类型”

开闭原则 开闭原则(OCP)是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed fo

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

http://blog.csdn.net/lovelion/article/details/7537584 为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键.在Java.C#等编程语言中,可以为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成.在很多面向对象编程语言中都提供了接口.抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展.如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有

面向对象五大原则_基石_开闭原则

1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed for modification". 翻译过来就是:"软件实体应当对扩展开放.对改动关闭". 这句话说得稍微有点专业,我们把它讲得更通俗一点,

day03_面向对象五大原则_基石_开闭原则

1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed for modification".翻译过来就是:"软件实体应当对扩展开放,对修改关闭".这句话说得略微有点专业,我们把它讲得更通俗一点,也就