美文网首页
面向对象的三大特征,五大原则(一)

面向对象的三大特征,五大原则(一)

作者: 凉笙_Notsad | 来源:发表于2018-09-22 00:23 被阅读0次

面向对象的三大特征,五大原则(一)

当你注意到设计模式的时候,我相信你已经在编程的道路上走的一段不短的路程了,同时也被需求的改变,多次的改变代码感到的厌烦。此时设计模式就正好可以解决我们的问题。
我学设计模式也有一段时间了,在我的理解中设计模式只不过是固定的一些套路,其中的核心思想还是面向对象的三大特征和五大原则

五大原则

一.单一职责原则(SRP)

职责单一原则的核心也就这么一段话:一个类有且只有一个引起它变化的原因,如果职责过多,功能过多,那么方法也会变化,方法只完成一个功能,类也只完成一个功能。
下面我为大家举个例子:

      public class PasswordVerification{
                
              public void login(String username,String password){

        if(validate(password)== false){
            return;
        }

        //操作数据库,判断用户密码对不对

    }

   public  boolean validate(String password){
        boolean result = false;
        if(password==null) {
            throw new RuntimeException("not blank");

        }else if(password.length() <6){
            System.out.println("密码长度不能小于6");

        }else{
            result = true;
        }
        return  result;

    }
        }

上面代码的代码就是符合单一职责原则的类和方法,在PasswordVerification类中只是对密码进行验证,每个方法也只是执行一个功能。

二.开闭原则(ocp)

同样的想要理解好开闭原则,则必须要理解下面几句话:。
1.对功能的扩展示允许的
2.增加功能或者修改功能通过新增代码来实现是允许的,是开放的。
3.对代码的修改是关闭的。

相信看到这里的时候大家多少会有点疑惑,首先第一点我相信大家都没有什么问题,关键是第二点,增加功能可以增加代码实现可以理解,但是修改功能,要靠增加代码实现?如何实现呢?

相信大家都有这样的一种感触就是修改代码最多的地方就是bug出现最多的地方,这样一来就会发现这个原则是非常必要的,那么如何做到呢?仔细想想,继承就是一个扩展了功能,但是没有修改任何已经存在的代码。
接下来我举个例子说明下:
dao层内容

public interface UserDao {
    void insert();
}
public class SqlServerUserDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("插入到 sqlserver");
    }
}
public class MySqlUserDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("插入到 mysql 数据库");
    }
}
public class SomeClass {
    public void  doSth(){
        System.out.println(" doSth in someclass");
    }


}
    public class SomeClassEx extends SomeClass {
    @Override
    public void doSth() {
        System.out.println("1111");
    }
}

用输出的语句代替连接的库数据类型。
service层内容

public class UserService {
    private UserDao userDao = new SqlServerUserDao();


    void insert(SomeClass someClass){
        //其它一些业务处理的代码

        someClass.doSth();
        userDao.insert();

    }

    public static void main(String[] args) {
        new UserService().insert(new SomeClassEx());
    }
}

仔细看上面的代码,你就会发现通过给这个方法传递一个你新增的实现这个接口的类,这样这个方法的功能变了,但没有修改已有的任何代码。

三.依赖倒转原则(DIP):

关于这个原则我,还是一用一句话来概括:
抽象不应该依赖细节,细节应该依赖抽象,关于这个原则还有个说法就是,高层不应该依赖于底层,两者都应该依赖于抽象
这句话的理解是其实就是依赖谁会更稳定的问题。这样说可能会有点抽象。我举个的例子结合来说下吧!
就像电脑中的主板上有很多的接口,有放置 CPU 的接口,有放置显卡的接口,而那些显卡厂商、CPU 厂商只需要生产出满足主板的接口要求的显卡与 CPU(比如多少个针脚,多长、多宽等)就可以用在电脑上了。这样我们的主板就可以使用任何的 CPU 与显卡,而不用一定只能使用某个特定厂商的CPU 与显卡。这远比那些集成显卡,CPU 的主板要好,因为只要这种集成的主板的显卡部件坏了,我们必须更换整个主板,而非集成模式的主板,只需要更换坏掉的显卡就可以了。 换句话来说,我们的主板依赖的那些 CPU、显卡的接口规范,而不是具体的 CPU、显卡这个具体的、明细的东西,反映在我们的程序中是如何处理呢?比如一个方法的参数尽量用比较顶级的类型,这样这个方法就不与某个具体的类耦合到一起了。

四.接口隔离原则

接口隔离原则,在我的理解中,把它理解成,接口分离原则更好一些,为什么呢,下面我举个例子说明下,比如现在我定义了一个鸟的行为的接口,定义了一个叫的方法,一个飞的方法,这样对于普通鸟类是没有问题的,但是鸵鸟,不会飞,所以对于鸵鸟来说这个飞的方法就很多余了。这个时候也就是我们说的接口污染。那么这个问题该怎么去解决呢?很简单,把鸟的行为接口分成两个接口,分别定义叫和飞的方法。这样就能很好的防止接口污染了。

相关文章

网友评论

      本文标题:面向对象的三大特征,五大原则(一)

      本文链接:https://www.haomeiwen.com/subject/ploanftx.html