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());
}
}
}

C#设计模式系列:开闭原则(Open Close Principle)的更多相关文章

  1. 设计模式六大原则(六): 开闭原则(Open Closed Principle)

    定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来: 在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...

  2. 开闭原则(Open Closed Principle,OCP)

    遵循开闭原则设计出的模块具有两个主要特征: 对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的 ...

  3. [设计模式]<<设计模式之禅>>关于开闭原则

    开闭原则是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的.灵活的系统,先来看开闭原则的定义: Software entities like classes,modules and fun ...

  4. C# 实例解释面向对象编程中的开闭原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

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

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

  6. Head First 设计模式 --3 装饰者模式 开闭原则

    装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比集成更有弹性的替代方案.设计原则:1:封装变化2:多用组合,少用继承3:针对接口编程,不针对实现编程4:为对象之间的松耦合设计而努力5 ...

  7. 【设计模式六大原则6】开闭原则(Open Close Principle)

      定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...

  8. 设计模式笔记:开闭原则(OCP,The Open-Closed Principle)

    1. 开闭原则概述 开闭原则(OCP,The Open-Closed Principle)两个主要特征: (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求 ...

  9. 设计模式原则(6)--Open-Closed Principle(OCP)--开闭原则

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.定义: 一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展. 2.使用场 ...

随机推荐

  1. 【原】iOS学习之应用之间的操作

    关于应用之间的相互操作,小编一直觉得非常高大上,在一次面试中被面试官一顿暴虐,今天小编就决定学习一下!经过一顿度娘,找到一些博客,不过都比较凌乱,我就打算自己整理一下! 首先要说的是每一个APP都可以 ...

  2. Java 实现HTML富文本导出至word完美解决方案

    一. 问题的提出 最近用java开发一个科技项目信息管理系统,里面有一个根据项目申请书的模板填写项目申报信息的功能,有一个科技项目申请书word导出功能. 已有的实现方式:采用标准的jsp模板输出实现 ...

  3. AFNetWorking设置HTTPRequestHeaders的坑

    今天在项目中要封装一个请求头但是用如下方法总是失败: 求其原因不知道: 于是乎改用了属性对象后居然成功了..: // //  RequestManager.m //  获取天气demo // //  ...

  4. 踏上Salesforce的学习之路(一)

    相信通过前面的学习,大家已经拥有了一个属于自己的Salesforce开发者账号,下面,我们将用这个账号正式踏上Salesforce的学习之路. 首先,点击网址:https://developer.sa ...

  5. 最简单的android自定义进度条样式

    一.自定义圆形进度条样式 1.在安卓项目drawable目录下新建一个xml文件如下:<?xml version="1.0" encoding="utf-8&quo ...

  6. 关于UIAlertAction如何修改sheet上的字体颜色

    相信很多程序员都会遇到需求是这样的: 但是你发现无论怎么设置cancel和Destructive都无法让红色字体移动到下面取消按钮上: 其实之前一直用错,用了ios9之前的UIActionSheet这 ...

  7. 【转】通过Hibernate将数据 存入oracle数据库例子

    一. Hibernate介绍 Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案.ORM方案的思想是将对象模型表示的对象映射到关系型数据 ...

  8. jQuery整理

    近几日总是在用js写一些东西,jq用的反而少了,最近在工作中总是会用到不常用的jQuery方法,之前觉得可能用到的情况比较少,便没在意这些方法,结果吃了亏,现在准备重新总结一些jQuery中的一些常用 ...

  9. python 之 Django 基础篇

    1,Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据 ...

  10. 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

    关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...