对于开闭设计原则ocp(open-close-principle)
)的理解:
简单的理解可以是:把在一个类中可变的对象方法用接口封装起来避免对象的方法变化时引起类的修改,和代码的可扩展性。
这个讲的有点抽象还是让我们通过具体例子来说一下吧,
下面一个例子是从汽车的引擎出发写的一个ocp设计原则代码
我们都知道汽车的引擎是会变的即类型不同
第一:不符合ocp设计原则
package noocp;
//不符合开闭原则的设计
public class car {
public String name;
private String eng;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getEng()
{
return eng;
}
public void setEng(String eng)
{
this.eng = eng;
}
public void Print()
{
System.out.println("汽车名称:"+name+":汽车引擎:"+eng+":");
}
}
package noocp;
//不符合开闭原则的设计
public class test {
public static void main(String[] args)
{
car c = new car();
c.setName("铃木");
c.setEng("v4");
c.Print();
}
}
之所以说它不符合ocp设计原则
是:这个类的设计中当汽车的引擎不同时,将会引起汽车类的修改
而下面我们看一下
第二:符合设计原则
package yesocp;
//ocp open-close-principle
//开闭设计原则:可变性封装原则:
//会变化的对象属性用一个接口封装起来例如下面
//汽车的引擎封装成一个接口
public class car {
public String name;
private IENG eng;//引擎是可变的 1.实例化引擎接口
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public IENG getEng()//获取引擎内容(获取输入信息)
{
return eng;
}
public void setEng(IENG eng)//设置引擎内容(传递输入信息)
{
this.eng = eng;
}
public void Print()//打印具体信息
{
System.out.println("汽车名称:"+name+":汽车引擎:"+eng.getEng()+":");
}
}
汽车接口
package yesocp;
interface IENG {
public String getEng();
}
package yesocp;
public class v4Eng implements IENG {
private String eng = "v4";
public String getEng() {
// TODO Auto-generated method stub
return eng;
}
}
package yesocp;
public class v8Eng implements IENG{
private String eng = "V8Eng";
@Override
public String getEng() {
// TODO Auto-generated method stub
return eng;
}
}
测试代码
package yesocp;
public class test {
public static void main(String[] args)
{
car c = new car();
c.setName("铃木");
c.setEng(new v4Eng());
c.Print();
c.setName("宝马");
c.setEng(new v8Eng());
c.Print();
}
}
我们将引起类的变化的对象,用接口封装起来,
当汽车引擎不同时只修改引擎接口就行了,而不用修改类。
通过上面的例子可以看出符合ocp设计原则的代码是一个对外可扩展的并对内且是修改 关闭的。