当程序需要变化时,尽量通过扩展程序的实体行为来实现变化,而不是通过修改已有代码来实现变化
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("画三角形"); } }
评论 抢沙发