zoukankan      html  css  js  c++  java
  • 北风设计模式课程---32、单一职责原则

    北风设计模式课程---32、单一职责原则

    一、总结

    一句话总结:

    单一职责原则(Single Responsibility Principle ):就一个类而言,应该仅有一个引起它变化的原因。
    每个人的职责尽量单一(每个类的职责单一),就照着生活实际来做设计模式。

    如果一个类承担的职责多于一个,那么引起它变化的原因就有多个。一个职责的变化甚至可能会削弱或者抑制类完成其他职责的能力,从而导致脆弱的设计。

    1、单一职责原则为什么是 就一个类而言,应该仅有一个引起它变化的原因。?

    因为如果一个类承担的职责多于一个,那么引起它变化的原因就有多个。一个职责的变化甚至可能会削弱或者抑制类完成其他职责的能力,从而导致脆弱的设计。

    2、面向对象,套用这些设计模式做系统的好处是什么?

    修改和扩展方便:这样扩展和修改可以不改变原有的代码,也就避免了很多未知的错误,原来的代码也还能以非常合理的方式保存下来
    比如登录:分为获取输入,校验,存入数据库:这样换一种校验方式也完全没必要去改变原来的代码,增加一个新的校验类即可,比如我们换了一个数据库,也只用增加一个数据库的类即可

    3、可以用增加方法的方式扩展功能,为什么要选择增加类的方式扩展功能(比如:登录:分为获取输入,校验,存入数据库)?

    1、如果是方法的话,每次扩展或者修改的话都必须要修改原来的代码(比如在类里面增加方法),如果是类,就不需要修改以前的代码,这样可以避免很多莫名其妙的bug
    2、代码量小的话,增加方法还不容易出错,但是代码特别多的情况,就很容易出错了
    3、代码量大,结构比较复杂的话,增加方法的方式结构有点混乱

    4、单一职责的好处是什么?

    1、仅有一个引起类变化的原因
    2、分工特别明确,不容易出错

    5、单一职责原则示例?

    1、接受客户端输入并提交到数据库。
    2、原有设计:一个类负责接受客户端输入,对客户端输入进行校验,连接数据库,并提交数据到数据库。
    3、现有设计:一个功能也就是一个职责由一个类来负责。

    6、单一职责原则对生活的启示?

    尽量减少职责:人的精力有限,如果什么都做,那很可能是什么都做不好

    二、内容在总结中

    1、相关知识

    1、接受客户端输入并提交到数据库。
    2、原有设计:一个类负责接受客户端输入,对客户端输入进行校验,连接数据库,并提交数据到数据库。
    3、现有设计:一个功能也就是一个职责由一个类来负责。

     

    2、代码

    1、接受客户端输入并提交到数据库。
    2、原有设计:一个类负责接受客户端输入,对客户端输入进行校验,连接数据库,并提交数据到数据库。

    MainClass.java

    import java.util.Scanner;
    
    
    public class MainClass {
        public static void main(String[] args) {
            //接受客户端的输入
            SaveToDB std = new SaveToDB();
            std.shuru();
            if(std.validate()) {
                std.getConnection();
                std.save();
            }
        }
    }

    SaveToDB.java

    import java.util.Scanner;
    
    
    public class SaveToDB {
        private String username;
        private String upassword;
        
        
        //获得客户端输入
        public void shuru() {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入用户名");
            username = scanner.nextLine();
            System.out.println("请输入密码");
            upassword = scanner.nextLine();
        }
        
        //进行数据校验
        public boolean validate() {
            if(username == null || "".equals(username.trim())) {
                System.out.println("用户名不能为空");
                return false;
            }
            if(upassword == null || "".equals(upassword.trim())) {
                System.out.println("密码不能为空");
                return false;
            }
            return true;
        }
        
        //连接数据库
        public void getConnection() {
            System.out.println("获得数据库连接");
        }
        
        //进行数据操作
        public void save() {
            System.out.println("将" + username + "保存到了数据库");
            System.out.println("将" + upassword + "保存到了数据库");
        }
    }


    3、现有设计:一个功能也就是一个职责由一个类来负责。
    Input.java

    package com.ibeifeng.ex2;
    
    import java.util.Scanner;
    
    public class Input {
        private String username;
        private String upassword;
        
        //获得客户端输入
        public void shuru() {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入用户名");
            username = scanner.nextLine();
            System.out.println("请输入密码");
            upassword = scanner.nextLine();
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getUpassword() {
            return upassword;
        }
    
        public void setUpassword(String upassword) {
            this.upassword = upassword;
        }
    }

    Validator.java

    package com.ibeifeng.ex2;
    
    public class Validator {
        //进行数据校验
        public boolean validate(String username, String upassword) {
            if(username == null || "".equals(username.trim())) {
                System.out.println("用户名不能为空");
                return false;
            }
            if(upassword == null || "".equals(upassword.trim())) {
                System.out.println("密码不能为空");
                return false;
            }
            return true;
        }
    }

    DBManager.java

    package com.ibeifeng.ex2;
    
    public class DBManager {
        //连接数据库
        public static void getConnection() {
            System.out.println("获得数据库连接");
        }
    }

    DAOImp.java

    package com.ibeifeng.ex2;
    
    public class DAOImp {
        //进行数据操作
        public void save(String username,String upassword) {
            System.out.println("将" + username + "保存到了数据库");
            System.out.println("将" + upassword + "保存到了数据库");
        }
    }

    MainClass.java

    package com.ibeifeng.ex2;
    
    public class MainClass {
        public static void main(String[] args) {
            Input input = new Input();
            input.shuru();
            Validator validator = new Validator();
            if(validator.validate(input.getUsername(), input.getUpassword())){
                DBManager.getConnection();
                DAOImp dao = new DAOImp();
                dao.save(input.getUsername(), input.getUpassword());
            }
        }
    }

    三、面向对象五大原则-----单一职责原则

    转自或参考:面向对象五大原则-----单一职责原则
    https://www.cnblogs.com/xiaobai1226/p/8663559.html

      什么是单一职责原则

      单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。

      所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

      为什么要使用单一职责原则

      如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责

    原则。此原则的核心就是解耦和增强内聚性。

      就好比,现在的手机,拥有各种各样的功能,拍照,打电话,发短信,玩游戏,导航。但是每一个功能又都不是那么强大,远远比不上专业的。

      拍照比不上专业单反,玩游戏比不上电脑或专业游戏机,导航比不上专业导航设备等等,这就是因为手机的职责太多了  

      一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用

    性。例如:要实现逻辑和界面的分离。

     
  • 相关阅读:
    AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization
    AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization
    url 编码(percentcode 百分号编码)(转载)
    AFNetworking 3.0 源码解读(二)之 AFSecurityPolicy
    使用UICollectionView实现首页的滚动效果
    AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager
    c 线程(平行世界)
    ZFPlayer 源码解读
    ios 音视频实现边播边缓存的思路和解决方案 (转)
    c 网络与套接字socket
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11106750.html
Copyright © 2011-2022 走看看