conceptos básicos
- El principio abierto cerrado es el principio de diseño más básico e importante en la programación.
- 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.
- 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.
- 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(" 绘制其它图形 ");
}
}