zoukankan      html  css  js  c++  java
  • 设计模式原则——开放封闭原则

    设计模式一共有六大原则:

    单一原则、开放封闭原则、接口分离原则、里氏替换原则、最少知识原则、依赖倒置原则。

    这篇博客是自己对开放封闭设计原则的一些拙见,有何不对欢迎大家指出。

    开放封闭原则:

    软件实体(类,模块,函数等)应该可以扩展,但是不可修改。

    (解释:其原则就是,设计一个类的时候时刻考虑,尽量要这个类足够的好,写好了就不要去修改了,如果有了新的需求变化,增加一个类就完事!原来的代码就不动了。)

    开放封闭原则是面向对象的核心所在。遵循这个原则可以带来面向对象的四个好处(可维护,可扩展,可复用,灵活性好)。开发中,对频繁变化的那部分做出抽象的处理。

    特征:

    1,对扩展是开放的。

    2,对修改是封闭的。

    Demo:

    我们来创建一个计算器。

    1,不遵守开放封闭原则

    UML:

    /**
     * 计算器的实现(无设计模式)
     * @author tujietg
     *
     */
    public class Calculator {
        public static void main(String[] args) throws Exception {
            Scanner scanner;
            System.out.println("输入a:");
            scanner = new Scanner(System.in);
            int a = scanner.nextInt();
            System.out.println("输入b:");
            scanner = new Scanner(System.in);
            int b = scanner.nextInt();
            System.out.println("输入:sign");
            scanner = new Scanner(System.in);
            String sign = scanner.nextLine();
    
            System.out.println(Operation(a, b, sign));
        }
    
        public static int Operation(int a, int b, String sign) throws Exception {
            int sum = 0;
    
            switch (sign) {
            case "+":
                sum = a + b;
                break;
            case "-":
                sum = a - b;
                break;
            case "*":
                sum = a * b;
                break;
            case "/":
                if (b == 0) {
                    throw new Exception("被除数不能为0");
                }
                sum = a / b;
                break;
            }
            return sum;
        }
    
    }

    如果现在增加一个平方的运算。需要修改原本写好的类(calculator),这违背了开放封闭原则。

    2,遵循开放原则

    UML:

    通过UML图可以看出,遵循开放封闭原则的实现多了一个抽象的运算类。

    运算抽象类:

    public abstract class Operation {
        int FirstNum;
        int SecondNum;
     
        public int getFirstNum() {
            return FirstNum;
        }
     
        public void setFirstNum(int firstNum) {
            FirstNum = firstNum;
        }
     
        public int getSecondNum() {
            return SecondNum;
        }
     
        public void setSecondNum(int secondNum) {
            SecondNum = secondNum;
        }
     
        public abstract int getResult() throws Exception;
    }

    运算实现类:

    //加法
    class OperationAddImpl extends Operation {
        @Override
        public int getResult() {
            return FirstNum + SecondNum;
        }
     
    }
     
    //除法
    class OperationDivImpl extends Operation {
        @Override
        public int getResult() throws Exception {
            if (SecondNum == 0) {
                throw new Exception("被除数不能为0");
            } else {
                return FirstNum / SecondNum;
            }
        }
     
    }
     
    //减法
    class OperationSubImpl extends Operation {
     
        @Override
        public int getResult() {
            return FirstNum - SecondNum;
        }
     
    }
     
    //乘法
    class OperationMulDivImpl extends Operation {
        @Override
        public int getResult() {
            return FirstNum * SecondNum;
        }
     
    }

    当我们的代码设计遵循了开放封闭原则时,这时,如果我们需要增加一个平方的需求,我们只需要创建一个平方的类(extends抽象类)。

    这样做,我们保持了原有代码的封闭效果,同时,实现了对扩展的开放。

    总结:

    对业务中经常变化的模块进行抽象。

    拒绝滥用抽象,业务中变化频率高的才考虑用抽象的方式。

  • 相关阅读:
    kmp dp hdu 3336
    Python之路【第三篇】:Python基础(18)——函数万能参数
    Python之路【第三篇】:Python基础(17)——函数动态参数
    Python之路【第三篇】:Python基础(16)——函数动态参数
    Python之路【第三篇】:Python基础(15)——函数指定参数
    Python之路【第三篇】:Python基础(13)——函数普通参数
    Python之路【第三篇】:Python基础(14)——函数默认参数
    Python之路【第三篇】:Python基础(12)——函数
    Python之路【第三篇】:Python基础(11)——set集合
    Python之路【第三篇】:Python基础(10)——set集合
  • 原文地址:https://www.cnblogs.com/tujietg/p/10241103.html
Copyright © 2011-2022 走看看