开放封闭原则 Open-Closed Principle(OCP)

Posted bhfdz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开放封闭原则 Open-Closed Principle(OCP)相关的知识,希望对你有一定的参考价值。

最理想的状态(或者目的)是软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的

1.栗子

 1 public class ErrorLogger
 2 
 3     private readonly string _whereToLog;
 4     public ErrorLogger(string whereToLog)
 5     
 6         this._whereToLog = whereToLog.ToUpper();
 7     
 8  
 9     public void LogError(string message)
10     
11         switch (_whereToLog)
12         
13             case "TEXTFILE":
14                 WriteTextFile(message);
15                 break;
16             case "EVENTLOG":
17                 WriteEventLog(message);
18                 break;
19             default:
20                 throw new Exception("Unable to log error");
21         
22     
23  
24     private void WriteTextFile(string message)
25     
26         System.IO.File.WriteAllText(@"C:\Users\Public\LogFolder\Errors.txt", message);
27     
28  
29     private void WriteEventLog(string message)
30     
31         string source = "DNC Magazine";
32         string log = "Application";
33          
34         if (!EventLog.SourceExists(source))
35         
36             EventLog.CreateEventSource(source, log);
37         
38         EventLog.WriteEntry(source, message, EventLogEntryType.Error, 1);
39     
40 

2.如果需要增加一个新的日志方式(比如数据库,服务等),怎么办?当然这段代码也违背了单一职责原则。

 1 public interface IErrorLogger
 2 
 3     void LogError(string message);
 4 
 5  
 6 public class TextFileErrorLogger : IErrorLogger
 7 
 8     public void LogError(string message)
 9     
10         System.IO.File.WriteAllText(@"C:\Users\Public\LogFolder\Errors.txt", message);
11     
12 
13  
14 public class EventLogErrorLogger : IErrorLogger
15 
16     public void LogError(string message)
17     
18         string source = "DNC Magazine";
19         string log = "Application";
20  
21         if (!EventLog.SourceExists(source))
22         
23             EventLog.CreateEventSource(source, log);
24         
25  
26         EventLog.WriteEntry(source, message, EventLogEntryType.Error, 1);
27     
28 

3.如果以上述的方式进行设计,那么新的需求加入,即可如下实现。

 1 public class DatabaseErrorLogger : IErrorLogger
 2 
 3     public void LogError(string message)
 4     
 5         // Code to write error message to a database
 6     
 7 
 8  
 9 public class WebServiceErrorLogger : IErrorLogger
10 
11     public void LogError(string message)
12     
13         // Code to write error message to a web service
14     
15 

参考:https://www.dotnetcurry.com/software-gardening/1176/solid-open-closed-principle

以上是关于开放封闭原则 Open-Closed Principle(OCP)的主要内容,如果未能解决你的问题,请参考以下文章

“开-闭”原则 (Open-Closed principle, OCP)

开放封闭原则

面向对象原则之一 开放封闭原则(开闭原则)

Charpter04 开放-封闭原则

设计原则之开放封闭原则

敏捷开发-开放封闭原则