设计模式 开闭原则

设计模式 - 开闭原则

即 对立与统一原则

什么是开闭原则

软件实体应该对扩展开放,对修改关闭,即实体应当通过扩展实现变化,而不是修改代码实现变化

什么是软件实体,项目或软件中按照一定逻辑规划划分的模块

抽象 类

方法

书店销售书籍

然后书写代码如下

// 书籍接口
public interface Ibook{
    // 名称
    public String getName();
    // 售价
    public int getPrice();
    // 作者
    public String getAuthor();
}

书店出售小说类书籍,书写代码

public class NoveIBook implements IBook {
    // 名称
    private String name;
    // 价格
    private int price;
    // 作者
    private String author;
    // 构造函数
    public NoveIBook(String _name, int _price, String _author){
        this.name = _name;
        this.price = _price;
        this.author = _author;
    }
    // 获得作者
    public String getAuthor(){
        return this.author;
    }
    // 价格
    public String getPrice(){
        return this.price;
    }
    // 名字
    public String getName(){
        return this.name;
    }
}

其中,价格定义为int,不是错误,非金融类项目,取两位精度,运算过程中,扩大100倍,展示时缩小100倍。

售书

public class BookStore {
    private final static ArrayList bookList = new ArrayList();
    // 下发的内容,是放置在持久层,即保存到硬盘中的
    // java的三层架构为视图层,服务层,持久层。
    // view 层 用于接收用户提交的请求代码
    // service 系统的业务逻辑
    // dao 持久层,操作数据库代码
    // 上下层,通过接口联系
    static{
        bookList.add(new NoveIBook("", 3200, ""));
    }
    // 买书
    public static void main(String[] args){
        // 大数格式化
        NumberFormat formatter = NumberFormat.getCurrencyInstance();
        formatter.setMaximumFractionDigits(2);
        for(IBook book:bookList){
            System.out.println(book.getName() + book.getPrice() + book.getAuthor());
        }
    }
}

然后,发生打折。

修改接口

接口不应该修改,因为接口是持久的

修改实现类

修改getPrice()方法达到打折的目的。

但是,因为采购书籍的人,要看到实现的价格。所以不修改

扩展实现

再增加一个子类,如下

代码如下

// 打折销售的小说
public class OffNovelBook extends NoveIBook {
    public OffNoveIBook(String _name, int _price, String _author){
        super(_name, _price, _author);
    }
    // 覆盖销售
    @Override
    public int getPrice(){
        return super.getPrice()*90 / 100;
    }
}

接着修改main里面的内容即可。

变化

变化分为逻辑变化,子模块变化,可见视图变化。

使用开闭原则

抽象约束

抽象约束对一组事物的描述。

当商店增加了一个计算机书籍的销售。但是计算机书籍还有很多种,有编程语言,数据库等。

// 增加计算机书籍接口
public interface IComputerBook extends IBook{
    // 计算机书籍
    public String getScope();   // 计算机书籍的范围
}

同样的,书写计算机书籍类

public class ComputerBook implements IComputerBook{
    private String name;
    private String scope;
    private String author;
    public ComputerBook(String _name, int _price, String _author, String _scope){
        this.name = _name;
        this.price = _price;
        this.author = _author;
        this.scope = _scope;
    }
    public String getScope(){
        return this.scope;
    }
    public String getName(){
        return this.name;
    }
    public int getPrice(){
        return this.price;
    }
}

直接在main中添加即可。

总结 ; 对扩展开放,前提对抽象约束。

元数据控制模块

即,使用配置参数,控制模块行为。

原则总结

单一职责

类的职责要单一

里氏替换

里氏替换原则不能破坏继承

即,子类对象,可以代替超类。

依赖倒置

面向接口。

即,每个接口只负责干一件事。

接口隔离

每个接口只干一件事

迪米特法则

通信通过类之间通信。两者之间耦合度越少越好。

## 开闭原则

对扩展开放,对修改关闭

www.iming.info

原文地址:https://www.cnblogs.com/melovemingming/p/10023787.html

时间: 2025-01-14 07:35:29

设计模式 开闭原则的相关文章

设计模式之6大原则(6)开闭原则

1. more第一版 实现基础功能,显示每一页固定24行文本,"q Enter"退出, "Enter" 下一行, "space Enter"下一页. /************************************************************************* > File Name: more01.c > Author: qianlv > Mail: [email protected] &

Java Web 设计模式之开闭原则

1.开闭原则(OCP) 遵循开闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.也就是说,我们可以改变模块的功能. (2)对于修改是关闭的(Closed for modification).对模块行为进行扩展时,不必改动模块的源代码或者二进制代码.模块的二进制可执行版本,无论是可链接的库.DLL或者.EXE文件,都无需改动. 2.通过UML

设计模式六大原则(6):开闭原则

开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码

设计模式之禅之六大设计原则-开闭原则

开闭原则 一:开闭原则的定义        --->一个软件实体如类.模块和函数应该对扩展开放,对修改关闭.        --->我们做一件事情,或者选择一个方向,一般需要经历三个步骤:What——是什么,Why——为什么,How——怎么做(简称3W原则,How取最后一个w)        --->对于开闭原则,我们也采用这三步来分析,即什么是开闭原则,为什么要使用开闭原则,怎么使用开闭原则? 二:如何使用开闭原则        --->抽象约束.               

C#设计模式系列:开闭原则(Open Close Principle)

1.开闭原则简介 开闭原则对扩展开放,对修改关闭,开闭原则是面向对象设计中可复用设计的基石. 2.开闭原则的实现 实现开闭原则的关键就在于抽象,把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征.作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改:同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的. 3.如何使用开闭原则 抽象约束 1>.通过接口或者抽象类约束扩展

【转】设计模式六大原则(6):开闭原则

定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统.开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩 展

设计模式--6大原则--开闭原则

开闭原则(Open Closed Principle) 开闭原则的核心是:对扩展开放,对修改关闭 白话意思就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化 开闭原则算是前5中原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固定的模式,但是最终保证的是提高程序的复用性.可维护性等要求 要使用这一原则还需要结合着它的思想"对扩展开放,对修改关闭"与其他的五大设计原则根据经验来开

11设计模式六大原则——开闭原则

定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统.开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开

C#软件设计——小话设计模式原则之:开闭原则OCP

前言:这篇继续来看看开闭原则.废话少说,直接入正题. 软件设计原则系列文章索引 C#软件设计——小话设计模式原则之:依赖倒置原则DIP C#软件设计——小话设计模式原则之:单一职责原则SRP C#软件设计——小话设计模式原则之:接口隔离原则ISP C#软件设计——小话设计模式原则之:开闭原则OCP 一.原理介绍 1.官方定义 开闭原则,英文缩写OCP,全称Open Closed Principle. 原始定义:Software entities (classes, modules, functi