El principio de apertura y cierre (al agregar nuevas funciones, no afectará la forma original de uso) Use la abstracción para construir el marco, use la práctica para expandir los detalles

conceptos básicos

  1. El principio abierto cerrado es el principio de diseño más básico e importante en la programación.
  2.  Una entidad de software como clase, módulo y función debe estar abierta para extensión (para el proveedor, la clase de herramienta es el destinatario ) y cerrada para modificación (para el usuario, el llamador ). Cree el marco con abstracción y amplíe los detalles con la implementación.
  3. Cuando el software necesite cambiar, intente lograr el cambio extendiendo el comportamiento de la entidad de software, en lugar de modificar el código existente.
  4. Siga otros principios en la programación, y el propósito de usar patrones de diseño es seguir el principio de apertura y cierre.

Cosas que hacer con el principio abierto y cerrado

Resuma las nuevas funciones que deben agregarse y aumente sus funciones extendidas a través de clases abstractas, de modo que el código del usuario no se cambie. Los usuarios siempre implementan nuevas funciones a través de llamadas a métodos abstractos de clases abstractas, que se usaron originalmente No llame directamente al método de implementación

 

La función original es dibujar rectángulos y círculos a través de la clase GraphicEditor, el siguiente código: El principio de diseño es asignar un valor a Shape.m_type a través del método de construcción, y dibujar los gráficos correspondientes a través de este valor.

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());
	}

}

//这是一个用于绘图的类 [使用方]
class GraphicEditor {
	//接收Shape对象,然后根据type,来绘制不同的图形
	public void drawShape(Shape s) {
		if (s.m_type == 1)
			drawRectangle(s);
		else if (s.m_type == 2)
			drawCircle(s);
	}

	//绘制矩形
	public void drawRectangle(Shape r) {
		System.out.println(" 绘制矩形 ");
	}

	//绘制圆形
	public void drawCircle(Shape r) {
		System.out.println(" 绘制圆形 ");
	}
	
}

//Shape类,基类
class Shape {
	int m_type;
}

class Rectangle extends Shape {
	Rectangle() {
		super.m_type = 1;
	}
}

class Circle extends Shape {
	Circle() {
		super.m_type = 2;
	}
}

Si necesita agregar una nueva característica, dibuje un triángulo 

Primero, debe agregar una nueva clase y, al mismo tiempo, debe modificar los métodos en la clase (usuario) GraphicEditor

//新增画三角形
class Triangle extends Shape {
	Triangle() {
		super.m_type = 3;
	}
}

Al mismo tiempo, debe modificarse en el método drawShape, agregando

else if (s.m_type == 3)
   drawTriangle(s);

Y tienes que agregar el método drawTriangle () para completar el dibujo

Necesita modificar la función original cuando se encuentran nuevas funciones,

 

formas de mejorar


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());
		graphicEditor.drawShape(new OtherGraphic());
	}

}

//这是一个用于绘图的类 [使用方]
class GraphicEditor {
	//接收Shape对象,调用draw方法
	public void drawShape(Shape s) {
		s.draw();
	}

	
}

//Shape类,基类
abstract class Shape {
	int m_type;
	
	public abstract void draw();//抽象方法
}

class Rectangle extends Shape {
	Rectangle() {
		super.m_type = 1;
	}

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println(" 绘制矩形 ");
	}
}

class Circle extends Shape {
	Circle() {
		super.m_type = 2;
	}
	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println(" 绘制圆形 ");
	}
}

//新增画三角形
class Triangle extends Shape {
	Triangle() {
		super.m_type = 3;
	}
	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println(" 绘制三角形 ");
	}
}

//新增一个图形
class OtherGraphic extends Shape {
	OtherGraphic() {
		super.m_type = 4;
	}

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println(" 绘制其它图形 ");
	}
}

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_41813208/article/details/103077719
Recomendado
Clasificación