设计模式六大原则之开闭原则
李羽秋
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("绘制三角形");
}
}
}
我们可以发现,当我们新增一个图形时,只需要重新写一个接口去实现,而不需要在修改源代码的基础上进行
功能的拓展。
分类:
设计模式
标签:
无