七大设计原则之开闭原则

2020-04-16 153次浏览 已收录 2个评论

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

package 开闭原则;

public class ocp {
public static void main(String[] args) {
 Graph graph=new Graph();
 graph.draw(new juxing());
 graph.draw(new yuan());
 /*
  * 存在的问题
  * 违反ocp原则,即对扩展开放(提供方),对修改关闭(使用方)
  * 如果要新增加一个图形,则需要修改的地方太多
  */
 //四个修改
 graph.drawsanjiao(new sanjiao());
}
}
//使用方(这里使用方也修改两代码,但是ocp原则不允许使用方修改代码)
class Graph{
 //接收Shpae对象,然后根据type来绘制不同图形
 public void draw(Shape s) {
  if(s.m_type==1) {
   drawju(s);
  }else if(s.m_type==2) {
   drawyuan(s);
  }else if(s.m_type==3) {
   //三个修改
   drawsanjiao(s);
  }
 }
 public void drawju(Shape r) {
  System.out.println("画矩形");
 }
 public void drawyuan(Shape r) {
  System.out.println("画圆形");
 }
 //画三角形
 //两个修改
 public void drawsanjiao(Shape r) {
  System.out.println("画三角形");
 }
}
//基类
class Shape{
 int m_type;
}
class juxing extends Shape{
 juxing() {
  super.m_type=1;
 }
}
class yuan extends Shape{
 yuan(){
  super.m_type=2;
 }
 
}
//新增三角形
//一个修改
class sanjiao extends Shape{
 sanjiao(){
  super.m_type=3;
 }
}

改进后

package 开闭原则;

public class ocp {
public static void main(String[] args) {
 Graph graph=new Graph();
 graph.draw(new juxing());
 graph.draw(new yuan());

 graph.draw(new sanjiao());
}
}
//使用方
class Graph{
public void draw(Shape s) {
 s.draw();
}
}
//基类
abstract class Shape{
 public abstract void draw();
}
class juxing extends Shape{
 @Override
 public void draw() {
  // TODO Auto-generated method stub
  System.out.println("画矩形");
 }
}
class yuan extends Shape{
 @Override
 public void draw() {
  // TODO Auto-generated method stub
  System.out.println("画圆形");
 }
 
}
//新增三角形
//一个修改
class sanjiao extends Shape{
 @Override
 public void draw() {
  // TODO Auto-generated method stub
  System.out.println("画三角形");
 }
}

渣渣龙, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:七大设计原则之开闭原则
喜欢 (0)

您必须 登录 才能发表评论!

(2)个小伙伴在吐槽
  1. 以后多发点哦
    你哥2020-05-26 09:33
  2. 我给你点赞了
    渣渣混2020-05-26 09:59