大飞

大飞 关注TA

挑战一切!

大飞

大飞

关注TA

挑战一切!

  •  世界的顶端
  • 混口饭吃
  • 写了333,609字

该文章投稿至Nemo社区   Java  板块 复制链接


设计模式 六大原则

发布于 2017/06/15 22:53 1,472浏览 0回复 3,574

原则一:单一职责原则

            单一功能原则(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. 迪米特法则或最少知识原则,从类与类之间耦合的角度去思考,降低耦合,减少不必要的耦合,不要跨越多层去调用方法,最佳的方式是只调用其朋友类的方法,之后行为由朋友类负责实施。

本文标签
 {{tag}}
点了个评