zoukankan      html  css  js  c++  java
  • 设计模式七大原则(1.2)

    什么是设计模式原则?

    设计模式原则是设计设计模式的原则,也就是设计模式应当如何设计所遵守的原则;换句话说,设计模式的设计是基于设计模式原则的。


    设计模式的七大原则

    • 单一职责原则
    • 接口隔离原则
    • 依赖倒置原则
    • 里氏替换原则
    • 开闭原则
    • 迪米特原则
    • 合成复用原则

    设计原则核心思想

    设计原则的目的是构建出更加稳定和健壮的软件。而像这样的软件要求

    • 松耦合
    • 可扩展性强

    1.单一职责原则(SRP Single Responsibility Principle)


    什么是单一职责原则?

    一个类只负责一项功能。

    单一职责原则的目的

    通过降低类的复杂度从而提高类的可读性,可扩展性

    单一职责的粒度(类与方法)

    通常情况下遵守单一职责原则是在类的粒度上的,但是当代码逻辑足够简单的情况下,可在方法上保持单一职责原则。



    2.接口隔离原则


    接口与接口隔离

    接口的作用之一是规范类,实现类的松耦合,进而实现软件的松耦合。

    换句话说,接口隔离也是一种单一职责原则的实现。

    接口隔离原则的目的

    接口隔离原则的要求就是明确接口功能,尽可能细分接口。

    接口的细化直接导致整个系统灵活性,但同时会带来结构的复杂性。

    比如说预先定义了10个接口,为了满足接口隔离而将接口分成20个。那么类在实现接口上会变得更加灵活,但接口的增多会导致结构的复杂性。



    3.依赖倒置原则


    依赖于抽象,不要依赖于具体。


    依赖倒置的是什么?


    类与类之间依赖变为类对接口的依赖。
    [from 百度百科] ![](https://img2018.cnblogs.com/blog/1401585/201908/1401585-20190810211858121-1079952537.png)

    目的

    解耦,增强模块复用性。

    依赖倒置原则的思想与Spring IOC容器机制相呼应,类对于接口的依赖降低了类之间的耦合性,而IOC中类对于容器的依赖同样解决了类之间高耦合的问题。


    依赖关系传递的三种方式

    • 接口传递
    • 构造方法传递
    • setter传递
    
    
    //接口传递
    interface Car
    {
        void drive();
    }
    
    interface Person
    {
        void lunch(Car car);
    }
    
    
    //构造方法传递
    
    interface Bicycle
    {
        void ride();
    }
    
    class Tom
    {
        private Bicycle bicycle;
    
        Tom(Bicycle bicycle)
        {
            this.bicycle=bicycle;
    
        }
    
    }
    
    //setter方法传递
    
    interface Weather
    {
        void sun();
    }
    
    class Today
    {
        private Weather weather;
    
        public void setWeather(Weather weather) {
            this.weather = weather;
        }
    }
    
    


    4.里氏替换原则


    继承的利与弊

    利:实现了代码重用,更加方便的实现了功能扩展。
    弊:增强了类之间的耦合性


    什么是里氏替换原则?

    在子类中尽量不要重写父类的方法。

    如果不得不重写,可提取出基类共同继承。另外也可通过聚合,依赖,组合的方式替代继承。

    class A
    {
        public void a1(){
            
        }
        public void a2(){
            
        }
        
    }
    
    class B extends A
    {
        @Override
        public void a1()
        {
            
        }
        
    }
    
    //提取基类后
    
    class Base
    {
        public void a2
        {
            
        }
    }
    class A extends Base
    {
        public void a1(){
    
        }
    }
    
    class B extends Base
    {
        public void a1(){
    
        }
    }
    


    5.开闭原则(OCP Open Closed Principle)


    什么是开闭原则?

    对扩展开放,对修改关闭。

    通俗的说,在软件功能需要扩展时,尽量增加代码,而不是修改原有代码。


    for example

    abstract class Action
    {
        abstract public void action();
    }
    
    class Describe
    {
        public void describe(Action action)
        {
            action.action();
        }
    }
    
    class A extends Action
    {
        public void action()
        {
            System.out.println("跑步");
        }
    }
    class B extends Action
    {
        public void action()
        {
            System.out.println("瑜伽");
        }
    }
    class C extends Action
    {
        public void action()
        {
            System.out.println("健身");
        }
    }
    
    class X extends Action
    {
        public void action()
        {
            System.out.println("xxx");
        }
    }
    
    
    
    public class Main
    {
        public static void main(String[] args)
        {
            Describe describe = new Describe();
            describe.describe(new A());
            describe.describe(new B());
            describe.describe(new C());
            describe.describe(new X());
        }
    }
    
    

    定义一个抽象类,其中有action方法,ABC类都有各自的行为,继承抽象类后重写方法。这些需要扩展新功能时只需新加一个像X一样的类就可以了。基本上不需要修改任何位置,只是扩展了功能。


    6.迪米特原则(最少知识原则)


    什么是迪米特原则?

    一个对象应该对其他对象保持最少的了解。


    表现形式

    只与直接的朋友通信。

    直接的朋友:除了出现在局部变量的类之外,都是直接朋友。

    换句话说:迪米特法则要求局部变量中最好不要出现陌生的类。

    目的

    降低类之间的耦合。(耦合只能尽量降低,无法消除)


    7.合成复用原则

    尽量使用合成/聚合代替继承。

    合成/聚合:某种类与类之间建立联系的方式。其耦合度低于继承。




    参考资料:
    设计模式之六大原则——接口隔离原则(ISP)
    依赖倒置原则
    面向对象原则之一 依赖倒置原则
    对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解
    里氏替换原则

  • 相关阅读:
    java环境基础步骤 svn
    java环境基础步骤 jdk tomcat eclipse
    @ModelAttribute 注解及 POJO入参过程
    cookie小记
    jquery指index
    Js文件中文乱码
    Redis基础(转)
    eclipse导出jar包的方法
    简单谈谈如何利用h5实现音频的播放
    yii2 GridView 下拉搜索实现案例教程
  • 原文地址:https://www.cnblogs.com/noneplus/p/11333038.html
Copyright © 2011-2022 走看看