1. 开闭原则概述

  开闭原则(OCP,The Open-Closed Principle)两个主要特征:

  (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求改变时,可以对模块进行扩展。

  (2)对修改关闭(closed for modification):对模块进行扩展时,不必改动模块的源代码

  开闭原则是面向对象设计中可复用设计的基石。

2. 开闭原则的实现

  开闭原则实现关键:抽象。

  抽象基类:把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改。

  派生类:从抽象基类派生一个或多个新的具体实现,可以扩展基类的行为,系统设计对扩展开放。

3. 如何使用开闭原则

  抽象约束:

  (1)通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法

  (2)参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;

  (3)抽象层尽量保持稳定,一旦确定即不允许修改。

  让设计对于最有可能发生的变化遵循OCP原则。遵循OCP原则的代价是很昂贵的,创建适当的对象需要开发时间和精力,抽象增加软件复杂度。把OCP应用限定在最有可能发生的变化上。

4. 开闭原则的优点

  (1)可复用性

  (2)可维护性

5.开闭原则重构

  违反开闭原则(OCP)原则的重构可采取设计模式:策略模式(Strategy)模板方法模式(Template Method)

6. 开闭原则示例

  Shape.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.OpenClosedPrinciple
{
public abstract class Shape
{
protected string _name; public Shape(string name)
{
this._name = name;
} /// <summary>
/// 面积
/// </summary>
/// <returns></returns>
public abstract double Area(); /// <summary>
/// 显示
/// </summary>
public abstract void Display();
}
}

  Rectangle.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.OpenClosedPrinciple
{
/// <summary>
/// 矩形
/// </summary>
public class Rectangle : Shape
{
private double _width;
private double _height; public Rectangle(string name, double width, double height)
: base(name)
{
this._width = width;
this._height = height;
} public override double Area()
{
return _width * _height;
} public override void Display()
{
Console.WriteLine("{0} 长:{1},宽:{2},面积:{3}", _name, _width, _height, this.Area());
}
}
}

  Circle.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.OpenClosedPrinciple
{
/// <summary>
/// 圆形
/// </summary>
public class Circle : Shape
{
private double _radius; public Circle(string name, double radius)
: base(name)
{
this._radius = radius;
} public override double Area()
{
return Math.Round(Math.PI * _radius * _radius, );
} public override void Display()
{
Console.WriteLine("{0} 半径:{1},面积:{2}", _name, _radius, this.Area());
}
}
}

设计模式笔记:开闭原则(OCP,The Open-Closed Principle)的更多相关文章

  1. 7.10 其他面向对象设计原则1: 开-闭原则OCP

    其他面向对象设计原则1: 开-闭原则OCP  Open-Closed Principle (OCP)5.1 设计变坏的前兆 Signs of Rotting Design  僵硬性 Rigidit ...

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

    前言:这篇继续来看看开闭原则.废话少说,直接入正题. 软件设计原则系列文章索引 C#软件设计——小话设计模式原则之:依赖倒置原则DIP C#软件设计——小话设计模式原则之:单一职责原则SRP C#软件 ...

  3. 设计原则:开闭原则(OCP)

    1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...

  4. 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...

  5. java设计模式学习笔记--开闭原则

    基本介绍 1.开闭(ocp)原则时编程中最基础.最重要的设计原则 2.一个软件实体如类.木块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节.即对提供方开放,对使用方关闭. 3.当软件 ...

  6. 【设计模式】之开闭原则(OCP)

    开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...

  7. 聊一聊开闭原则(OCP).

    目录 简述 最早提出(梅耶开闭原则) 重新定义(多态开闭原则) 深入探讨 OCP的两个特点 对外扩展开放(Open for extension) 对内修改关闭 抽象 关闭修改.对外扩展? 简述 在面向 ...

  8. 【面向对象设计原则】之开闭原则(OCP)

    开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...

  9. JavaScript 开闭原则OCP

    代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

随机推荐

  1. Xmind8 破解

    链接: https://pan.baidu.com/s/1IaNyngxJnKDQ0dNqPasA7w 提取码: g3q2 步骤1: 下载安装XMind 8 . 百度网盘下载: https://pan ...

  2. RMAN_RAC归档日志备份包恢复到单机

    恢复归档日志的方法: RAC是ASM的存储且是OMF创建的格式,所以RAC的日志名为如下+ARCH/mioa/archive/1_73554_875548170.dbf.+ARCH/mioa/arch ...

  3. Java NIO5:通道和文件通道

    一.通道是什么 通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字 ...

  4. Generative Adversarial Nets[Vanilla]

    引言中已经较为详细的介绍了GAN的理论基础和模型本身的原理.这里主要是研读Goodfellow的第一篇GAN论文. 0. 对抗网络 如引言中所述,对抗网络其实就是一个零和游戏中的2人最小最大游戏,主要 ...

  5. kafka模型理解

    1.消息发送至一个topic,而这个topic可以由多个partition组成,每条消息在partition中的位置称为offset 2.消息存在有效期,如果设置为2天,则消息2天后会被删除 3.每个 ...

  6. Ubuntu中libprotobuf版本冲突的解决方案

    先说解决方法: 因为我出现这个比较奇特,我再下面环境中的第一个项目有这个问题,但是不知道怎么瞎折腾就搞定了,不报这个异常了 不论是Qt Creator直接运行Debug或者Release都没问题 但是 ...

  7. Java调度池的实现原理

    下图是关于ScheduledFutureTask的继承体系结构图.

  8. nginx 动态添加ssl模块

    一.查看nginx模块 /usr/local/nginx/sbin/nginx -V 二.安装openssl包 yum -y install pcre  pcre-devel zlib  zlib-d ...

  9. configure: error: cannot guess build type; you must specify one解决方法

    原文地址:https://blog.csdn.net/hebbely/article/details/53993141 1.configure: error: cannot guess build t ...

  10. python学习第十篇——while 的灵活运用

    sandwiches_orders = ['apple','banana','mango',"apple","watermelon"] finished_san ...