C#设计模式六大原则 - 单一职责

单一职责原则 SRP:

Single Reponsibility Principle,简称:SRP

一个类只负责一项职责。换种说法,就一个类而言,应该只有一个引起它变化的原因。

问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。

解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。


单一职责的成本:类变多了;上端需要了解更多的类

衡量着使用

  • 如果类相对稳定,扩展变化少,而且逻辑简单,违背单一职责也没关系
  • 一个类不要让他太“累”
  • 如果不同的职责,总是一起变化,这种是一定要分开的

举例

一个简单的例子,动物的故事,代码如下:

	public class Animal
    {
    	protected string _Name = null;
    	
    	public Animal(string name)
        {
            this._Name = name;
        }
        
        public void Action()
        {
            if (this._Name.Equals("鸡"))
            {
            	Console.WriteLine($"{this._Name} flying");
        	}
            else if (this._Name.Equals("鱼"))
            {
            	Console.WriteLine($"{this._Name} swimming");
        	}
        	//……
        }
    }

动物类,呼吸方法中分别写了鸡和鱼的活动方式,鸡活动是飞、鱼活动是游泳,当出现其他动物时Action类就不稳定了,就得不断的修改此方法,不断的 if…else… 。因此,制造了不稳定性,若方法内业务复杂,容错率就非常低了。

倘若将代码改写一下。设置一个抽象类Animal。鱼类AnimalFish和鸡类AnimalChicken分别继承自动物类。类的复杂性降低了,可读性也同时提高了,最重要的是职责划分也明确了。当然,也就更容易维护了。
代码如下:

public abstract class Animal	//动物类 ——— 抽象类
{
	protected string _Name = null;
	public Animal(string name)
    {
        this._Name = name;
    }
    public abstract void Breath();
    public abstract void Action();
}

public class AnimalFish : Animal	//鱼类
{
    public AnimalFish(string name) : base(name)
    {}
    public override void Breath()
    {
        Console.WriteLine($"{this._Name} 呼吸水");
    }

    public override void Action()
    {
        Console.WriteLine($"{this._Name} swimming");
    }
}

public class AnimalChicken : Animal		//鸡类
{
    public AnimalChicken(string name) : base(name)
    {}
    public override void Breath()
    {
        Console.WriteLine($"{this._Name} 呼吸空气");
    }

    public override void Action()
    {
        Console.WriteLine($"{this._Name} flying");
    }
}
class Program
{
	static void Main(string[] args)
	{
		{
            Animal animal = new AnimalChicken("鸡");
            animal.Breath();
            animal.Action();
        }
        {
            Animal animal = new AnimalFish("鱼");//呼吸水
            animal.Breath();
            animal.Action();
        }
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值