设计模式七大原则

本文概述了面向对象设计中的七个基本原则:开闭原则强调扩展性,依赖倒置原则提倡抽象编程,单一职责原则保证代码清晰,接口隔离原则避免逻辑冗余,迪米特法则减少耦合,里氏替换原则支持继承的灵活性,合成复用原则提倡组合而非继承。每个原则都通过实例说明其重要性。

一、开闭原则

一句话总结:对扩展开放,对修改关闭

该原则主要就是为了警示我们在开发需求中,要多思考每次的需求迭代是在原有的代码基础上进行扩展,而不是必须修改原有的代码才能实现新的需求。

二、依赖倒置原则

一句话总结:面向抽象编程、面向接口编程、高层模块步依赖于低层模块、要依赖抽象

该原则也就是要具体的事物抽象为一个抽象类或者接口,比如一个人吃饭,可能吃面条、米饭、汉堡等,而这些类都是食物类,因此这时候就应该把这些都抽象为一个食物接口,而不应该是具体的苗条类、米饭类等等。

三、单一职责原则

一句话总结,每个接口 每个类 甚至每个方法都应该要只负责一个职责

该原则主要就是为了让代码简洁、逻辑清晰、可读性高

四、接口隔离原则

句话总结:每一项功能都应该用一个接口来实现,而不应该在一个接口中重复的写不同的逻辑

比如最近做的系统用户的冻结、解冻、删除、还原功能,就应该细拆分为4个接口,虽然简单但是也不应该融合在一个接口中,比如如果写在一个接口中,后面要进行需求迭代,要求什么什么样的条件下,才能冻结、解冻或者删除或者还原,那么就需要修改原有的接口的逻辑,既违反了开闭原则,也使得代码逻辑复杂  且大量堆积

五、迪米特法则

一句话总结:最少知道

举个例子,比如老板需要知道一个部门中有多个员工,此时部门主管把员工数统计出来就可以了,也就是老板直接调用部门的统计人数的方法就可以,并不需要在老板类中在创建员工类,老板并不需要知道具体的员工,只需要知道数量就OK了

六、里氏替换原则

一句话总结:子类可以对父类功能进行延申扩展,输入更宽松、输出更严格或相等

举个典型得例子,正方形是一个特殊得长方形,那么如果使用正方形继承长方形,那么在以下的例子中就会违反里氏替换原则。可以清楚的看到 while条件中,如果是正方形则while条件永远为真,因此这种继承关系是违反里氏替换原则的。

public class TestLiskov {

    public static void resize(RecTangle recTangle) {
        while (recTangle.getWidth() >= recTangle.getHeight()) {
            recTangle.setHeight(recTangle.getHeight() + 1) ;
            System.out.println("width=" + recTangle.getWidth() + "height=" + recTangle.getHeight());
        }
        System.out.println("压缩完成");
    }

    public static void main(String[] args) {

        RecTangle recTangle = new RecTangle();
        recTangle.setHeight(10L);
        recTangle.setWidth(20L);
        resize(recTangle);
        Square square = new Square();
        square.setLength(15l);
        resize(square);


    }
}

这是由于正方形其实和长方形并不是继承is-a的关系,此时如果使用四边形作为父类,就可以符合里氏替换原则了。在IDEA代码层面就会给出爆红提示

七、合成复用原则

一句话总结:更多的使用聚合组合 ,避免过多的使用继承造成继承泛滥、耦合性高难以 维护

举个例子,一个汽车具有自动档和手动档的,并且有白色、黑色、蓝色3种颜色,错误的做法就是形成3*2六个类 白色自动档汽车继承汽车类、黑色自动档汽车继承汽车类。。。。。,比如某天要对白色汽车进行限号处理,那么至少需要改两个类。而正确的做法应该是设置一个颜色类 一个功能类 使用组合 聚合的方式 来得到汽车得外观和功能 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值