目录

设计模式六大原则之开闭原则

李羽秋
李羽秋 2022年01月29日  ·  阅读 1,460

设计模式六大原则之开闭原则

1.基本介绍

  • 一个软件实体如类,模块和函数应该对扩展开放(对于提供方来说),对修改关闭(对于使用方来说)。用抽象

    构建框架,用实现扩展细节。

  • 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化

2.基本代码实现

public class Ocp {
    public static void main(String[] args) {
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
    }

   public static class GraphicEditor{
        public void drawShape(Shape s){
            if (s.m_type ==1) drawRectangle(s);
            else if (s.m_type ==2) drawCircle(s);
        }

        private void drawCircle(Shape s) {
            System.out.println("绘制圆形");
        }

        private void drawRectangle(Shape s) {
            System.out.println("绘制矩形");
        }
    }
    //Shape类,基类
  public static class Shape {int m_type;}
   public static class Rectangle extends Shape{
        Rectangle(){
            super.m_type =1;
        }
    }
    public  static class Circle extends Shape{
        Circle(){
            super.m_type =2;
        }
    }
}

3.在基础代码基础上新增功能,话三角形


public class Ocp { 【使用方】
    public static void main(String[] args) {
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        //新增的代码
        graphicEditor.drawShape(new Triangle());
    }

   public static class GraphicEditor{
        public void drawShape(Shape s){
            if (s.m_type ==1) drawRectangle(s);
            else if (s.m_type ==2) drawCircle(s);
            //新增的代码
            else if (s.m_type ==3) drawTriangle(s);
        }

        private void drawCircle(Shape s) {
            System.out.println("绘制圆形");
        }

        private void drawRectangle(Shape s) {
            System.out.println("绘制矩形");
        }
        //新增的代码
       private void drawTriangle(Shape s) {
           System.out.println("绘制三角形");
       }
    }
    //Shape类,基类
  public static class Shape {int m_type;}
   public static class Rectangle extends Shape{
        Rectangle(){
            super.m_type =1;
        }
    }
    public  static class Circle extends Shape{
        Circle(){
            super.m_type =2;
        }
    }
    //新增的代码
    public  static class Triangle extends Shape{
        Triangle(){
            super.m_type=3;
        }
    }
}

可发现,当新增一个图形时,需要修改的地方太多,不符合开闭原则

4.基于OCP原则改进

package com.example.springboottest.openclose;

public class improve {
    public static void main(String[] args) {
        graphicEditor graphicEditor = new graphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }
    public static class graphicEditor{
        public void drawShape(Shape s) {
            s.draw();
        }
    }

    public static  abstract class Shape{
        int m_type;
        public abstract void draw();
    }
    public static class Rectangle extends Shape{
        public Rectangle() {
            super.m_type =1;
        }
        @Override
        public void draw() {
            System.out.println("绘制矩形");
        }
    }
    public static class Circle extends Shape{
        public Circle() {
            super.m_type =2;
        }
        @Override
        public void draw() {
            System.out.println("绘制圆形");
        }
    }
    public static class Triangle extends Shape{
        public Triangle() {
            super.m_type =3;
        }
        @Override
        public void draw() {
            System.out.println("绘制三角形");
        }
    }

}

我们可以发现,当我们新增一个图形时,只需要重新写一个接口去实现,而不需要在修改源代码的基础上进行

功能的拓展。

参考:https://www.cnblogs.com/rmxd/p/12541911.html

分类: 设计模式
标签: