原则一:单一职责原则
单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该 功能平行(功能平行,意味着没有依赖)。——维基百科
public interface MocaelPresenter { //属性 void setAge(int age); void setHeight(int height); void setSex(int sex); //行为 boolean canSwimming();
boolean canPlayBasketball();
}
某个对象具有以上五种方法,根据他们的相似度,可以规划为属性和行为两种,那种在设计上可以将他们分开两个接口写,这在一定程度上保证了单一性,降低复杂性。
原则二:里氏替换原则
里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。-------百度百科
通俗来讲,不要去重写父类已经实现的原有方法,破坏父类原有的功能,但可以扩展父类的方法。
原则三:依赖倒置原则
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
如下指个例子:妈妈做菜给女儿吃
package com.example.fwms.designmode.tenet;
/**
* 创建 by 刘宇飞 on 2017/6/15.
* 邮箱:3494576680@qq.com
* 描述
*/
public class Mama {
public void cook(Girl girl){
girl.likeEat();
}
}
package com.example.fwms.designmode.tenet;
import android.util.Log;
/**
* 创建 by 刘宇飞 on 2017/6/15.
* 邮箱:3494576680@qq.com
* 描述
*/
public class Girl {
public void likeEat(){
Log.e(this.getClass().getName(),"今天想吃鱼");
}
}
妈妈不能只对女儿好,儿子也想吃妈妈的菜,但这个耦合度就非常的高了,不易于修改;按照里氏替换原则进行接口编程修改。
创建吃的接口由女儿和儿子去实现,创建做菜的接口由妈妈去实现
package com.example.fwms.designmode.tenet;
/**
* 创建 by 刘宇飞 on 2017/6/15.
* 邮箱:3494576680@qq.com
* 描述 做饭接口
*/
public interface CookOption {
void cook(EatOption option);
}
package com.example.fwms.designmode.tenet;
import android.util.Log;
/**
* 创建 by 刘宇飞 on 2017/6/15.
* 邮箱:3494576680@qq.com
* 描述
*/
public class Girl implements EatOption {
@Override
public void likeEat(){
Log.e(this.getClass().getName(),"今天想吃鱼");
}
}
package com.example.fwms.designmode.tenet;
import android.util.Log;
/**
* 创建 by 刘宇飞 on 2017/6/15.
* 邮箱:3494576680@qq.com
* 描述
*/
public class Son implements EatOption {
@Override
public void likeEat() {
Log.e(this.getClass().getName(),"今天红烧肉");
}
}
package com.example.fwms.designmode.tenet;
/**
* 创建 by 刘宇飞 on 2017/6/15.
* 邮箱:3494576680@qq.com
* 描述 做饭接口
*/
public interface CookOption {
void cook(EatOption option);
}
package com.example.fwms.designmode.tenet;
/**
* 创建 by 刘宇飞 on 2017/6/15.
* 邮箱:3494576680@qq.com
* 描述
*/
public class Mama implements CookOption {
@Override
public void cook(EatOption option) {
option.likeEat();
}
}
这样解耦度就非常高了。
原则四:接口隔离原则
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。--------百度文档
很容易理解,一个接口写的方法太多,其实现类都需要对其接口去实现,但是并不是所有的方法都是它需要的,这就造成了冗余。那么,
我们就需要将相同的方法抽取出来,将不相同或者可能变化的方法也提取出来,分别实现,下次修改某接口的时候,就少避免了不必要的实现。
原则五:最少知道原则
这个原理的名称来源于希腊神话中的农业女神,孤独的得墨忒耳。
很多面向对象程序设计语言用"."表示对象的域的解析算符,因此得墨忒耳定律可以简单地陈述为“只使用一个.算符”。因此,a.b.Method()违反了此定律,而a.Method()不违反此定律。一个简单例子是,人可以命令一条狗行走(walk),但是不应该直接指挥狗的腿行走,应该由狗去指挥控制它的腿如何行走。----WIKIPIDIA
简单来说就是要让对象与对象独立起来,具体对象的行为由具体的对象去完成,而不是由某个对象去指定另一个对象去实施行为而且是具体的行为。
原则六:开闭原则
开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”
归纳总结:
1. 单一职责原则是从类的功能的角度去设计,将不同的职责分别归于不同的类中,这样使得设计更加清晰、易修改。
2. 里氏替换原则是从类的继承的角度去设计,强调父类被子类继承后,在父类出现的地方,可以替换为其子类,而且行为不会发生变化。
3. 依赖倒置原则是从类之间依赖关系的角度去设计,强调高层不依赖于低层,低层依赖于高层,减少实现细节的依赖。
4. 接口隔离原则是从接口的方法设计角度去思考,强调不能过度设计接口,尽量使得接口内的方法能充分的提供给其实现类需要的功能,不要过度设计导致方法的冗余,也不要设计不充分导致,实现类中有未能抽取的公共部分。
5. 迪米特法则或最少知识原则,从类与类之间耦合的角度去思考,降低耦合,减少不必要的耦合,不要跨越多层去调用方法,最佳的方式是只调用其朋友类的方法,之后行为由朋友类负责实施。