单一职责原则(Single Responsibility Principle,SRP)
定义:
一个类只有一个发生变化的原因。通俗的说,一个类只负责一项职责。又称单一功能原则,适用于接口、方法、类
原理:
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力
优点:
降低类的复杂度
提高类的可读性
提高系统的可维护性
变更引起的风险降低,一个接口的修改只对相应的实现类有影响,对其他接口无影响,这对系统的扩展性,维护性都有非常大的帮助
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SRP.Study
{
/// <summary>
/// 照相的接口
/// </summary>
public interface IPhotograph
{
void Photograph();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SRP.Study
{
/// <summary>
/// 播放音乐的接口
/// </summary>
public interface IPlayMusic
{
void PlayMusic();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SRP.Study
{
/// <summary>
/// 实现拍照、播放音乐的手机类
/// </summary>
public class MobilePhone : IPhotograph, IPlayMusic
{
/// <summary>
/// 拍照方法
/// </summary>
public void Photograph()
{
Console.WriteLine("拍照片");
}
/// <summary>
/// 播放音乐方法
/// </summary>
public void PlayMusic()
{
Console.WriteLine("播放音乐");
}
}
}
拆分类,确认单一职责
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SRP.Study
{
/// <summary>
/// 相机类
/// </summary>
public class Carmera : IPhotograph
{
/// <summary>
/// 拍照方法
/// </summary>
public void Photograph()
{
Console.WriteLine("拍照片");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SRP.Study
{
/// <summary>
/// 音乐类
/// </summary>
public class Music : IPlayMusic
{
/// <summary>
/// 播放音乐方法
/// </summary>
public void PlayMusic()
{
Console.WriteLine("播放音乐");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SRP.Study
{
class Program
{
static void Main(string[] args)
{
try
{
//MobilePhone phone = new MobilePhone();
//phone.PlayMusic();
//phone.Photograph();
IPhotograph Carmera = new Carmera();
IPlayMusic Music = new Music();
Music.PlayMusic();
Carmera.Photograph();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
}