设计模式------设计原则

      

       六中设计原则

原则一:单一设计原则

定义:一个类只负责一项职责(注意 : 这里的类不光指类,也适用于方法和接口,比如我们常说的一个方法实现一个功能)

举例说明:动物吃东西的场景

 

现在:来了一只老虎

 

过会又来只蚯蚓

 

好处:类的复杂度降低、可读性提高、可维护性提高、扩展性提高、降低了变更引起的风险

 

原则二:迪米特法则

定义: 迪米特法则也叫做最少知识原则(Least Knowledge Principle,LKP),即一个对象应该对其他对象有最少的了解,也就是说一个类要对自己需要耦合或者调用的类知道的最少。我只知道你有多少public方法可以供我调用,而其他的一切都与我无关。

举一个例子:学校领导老师点名,老师让体育委员清点人数

   

class Program
{
static void Main(string[] args)
{
Console.WriteLine("周末放假,学校领导命令老师去点名.....");
List<student> students = new List<student>();
for (int i = 0; i < 20; i++)
{
students.Add(new student());
}
teacher teacher = new teacher();
teacher.command(new studentLeader(students));
Console.ReadKey();
}
}
class teacher
{
public void command(studentLeader StudentLeader)
{
Console.WriteLine("老师接到命令,委托体育委员清点人数......");
StudentLeader.counts();
}
}
class studentLeader
{
private List<student> students;
public studentLeader(List<student> students)
{
this.students = students;
}
public void counts()
{
Console.WriteLine("体育委员开始清点人数......");
int counts = students.Count();
Console.WriteLine("体育委员清点结束,人数为" + counts);

}
}
class student { }

 

 

 

 好处:降低类与类之间的耦合

迪米特法则的核心观念就是类间解耦,最终可能产生的结果就是会产生了大量的中转类。为了把解耦做到极致导致实现一个业务逻辑的实现跳转了很多类,这也是不可取的做法。因此根据实际权衡利弊才是重要的

 

(继承作为面向对象三大特性之一,在给程序设计带来巨大便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能会产生故障。)

 

原则三:里氏替换原则

里氏替换原则简单易懂一点的定义就是:只要父类出现的地方子类就可以出现,且替换成子类也不会出现任何错误或者异常。(但是反过来,有子类出现的地方,父类不一定可以适用)。

. 里氏替换原则是为继承定义了四个规范

① 子类必须完全实现父类的方法

② 子类可以有自己的个性

③覆盖或者实现父类的方法时输入参数可以被放大

④复写或实现父类的方法时返回值可以缩小。

原则四:依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

 

原则五:接口隔离原则

 

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 
问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

举例来说明接口隔离原则:

 

 

 

 原则六: 开闭原则

具体的定义是:一个软件实体,比如类,模块,函数应该对扩展开放,对修改关闭。说的通熟易懂一些就是一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现改变。

 

 

转载于:https://www.cnblogs.com/zxnew/p/9530058.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值