zoukankan      html  css  js  c++  java
  • 设计模式七大原则之单一职责原则

    单一职责原则

      对类来说,一个类应该只负责一项职责,如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。

      这里的职责是指类变化的原因。单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。

      该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在两个缺点:

        1.一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;

        2.当客户端需要该对象某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。

      单一职责原则的核心:控制类的粒度大小、将对象解耦、提高其内聚性。

      单一职责同样也适用于方法。一个方法应该尽可能做好一件事情。如果一个方法处理的事情太多,其颗粒度就会变得很粗,不利于重用。

    SingleResponsibility1.java

    public class SingleResponsibility1 {
        public static void main(String[] args) {
            Vehicle vehicle = new Vehicle();
            vehicle.run("摩托车");
            vehicle.run("汽车");
            vehicle.run("飞机");
        }
    }
    /**
     * 交通工具类
     * 在run方法中,违反了单一职责原则
     * 解决的方法:根据交通工具运行方法的不同,分解成不同的类
     */
    class Vehicle {
        public void run(String vehicle){
            System.out.println(vehicle+"在公路上运行");
        }
    }

    SingleResponsibility2.java

    public class SingleResponsibility2 {
        public static void main(String[] args) {
            RoadVehicle roadVehicle = new RoadVehicle();
            roadVehicle.run("摩托车");
            AirVehicle airVehicle = new AirVehicle();
            airVehicle.run("飞机");
            WaterVehicle waterVehicle = new WaterVehicle();
            waterVehicle.run("轮船");
        }
    }
    
    /**
     * 遵守单一职责原则
     * 改动很大:即将类分解,同时修改客户端
     * 改进:直接修改Vehicle类,将单一职责原则往下传递,即在方法级别上做单一职责原则
     */
    class RoadVehicle{
        public void run(String vehicle){
            System.out.println(vehicle+"公路运行");
        }
    }
    class AirVehicle{
        public void run(String vehicle){
            System.out.println(vehicle+"天空运行");
        }
    }
    class WaterVehicle{
        public void run(String vehicle){
            System.out.println(vehicle+"水中运行");
        }
    }

    SingleResponsibility3.java

    public class SingleResponsibility3 {
        public static void main(String[] args) {
            Vehicle2 vehicle2 = new Vehicle2();
            vehicle2.run("汽车");
            vehicle2.runWater("轮船");
            vehicle2.runAir("飞机");
        }
    }
    
    /**
     * 在方法上遵守单一职责,但类上没有遵守单一职责原则.
     */
    class Vehicle2 {
        public void run(String vehicle){
            System.out.println(vehicle+"在公路上运行");
        }
        public void runAir(String vehicle){
            System.out.println(vehicle+"在天空上运行");
        }
        public void runWater(String vehicle){
            System.out.println(vehicle+"在水中上运行");
        }
    }
  • 相关阅读:
    【scala语言入门】二、匿名函数
    【scala语言入门】 一、apply与unapply
    关于timeOut超时后是否会回滚的思考
    [算法]-插入排序
    【oenCV系列】 写视频
    【Opencv系列】
    Factory Method模式精解(C++版本)
    Template Method模式精解(C++版本)
    Adapter模式精解(C++版本)
    迭代器模式精解(C++版本)
  • 原文地址:https://www.cnblogs.com/clownAdam/p/13210953.html
Copyright © 2011-2022 走看看