所有的设计模式都是为了五个基本原则服务的,这五个基本原则单一职责原则、开闭原则、接口隔离原则、里氏替换原则和依赖倒置原则,而这几个原则当中最为重要的便是开放封闭原则,先复制黏贴上一段当介绍开放封闭原则肯定会提及的话,就是开放封闭原则的核心思想
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
因此,开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
做这么一个比喻吧,有一个餐厅有一群厨师,每个厨师都会做所有的菜,这个餐厅有三样菜色,分别是辣的,甜的,咸的。
class orderFood
{
private Cook cook = new Cook();
public void orderFood(ClientNeed clientneed)
{
switch(clientneed.type())
{case "SpicyFood"
cook.makeSpicyFood();
break;
case "SweetFood"
cook.makeSweetFood();
break;
case "SaltyFood"
cook.makeSaltyFood();
break;
}
}
}
如果有一天餐馆要推出新的菜色了,酸的,那么是不是所有的厨师都要学习怎么做新的菜色呢?那么就要在cook这个类下面写一个新的函数,makeSourFood(),这个行为本身没什么问题,但问题就在于开发过程中尽量不要对原来的代码进行大的改动,回到定义,对扩展是开放的,而对修改是封闭的,尽量不要修改原来就具备的类(在此例中就是Cook这个类)的基础上,扩展新的功能(makeSourFood())。
如果要很方便的达到这个目的应该怎么做呢?
如果设想这个餐馆,每个厨师都只会做一种菜色,那么如果这个餐馆要添加的菜色的时候直接招新的厨师过来就可以了啊,而新的厨师也只会做一种菜色,比如只会做酸菜。那么该怎么写呢?
还是那个class orderFood(注释中是原代码)
class orderFood
{
private Cook cook = new Cook();
public void orderFood(ClientNeed clientneed)
{
switch(clientneed.type())
{
case "SpicyFood"
cook=new SpicyCook();//寻找只做辣菜色的厨师,这些厨师了都继承自Cook这个接口类,Cook类内就一个cookFood()
//cook.makeSpicyFood(); 让随意哪一个厨师做辣的菜,下同
break;
case "SweetFood"
cook=new SweetCook();
//cook.makeSweetFood();
break;
case "SaltyFood"
cook=new SaltyCook();
//cook.makeSaltyFood();
break;
}
cook.cookFood();
}
}
这样当需要新的菜色的时候就可以直接加一个case用于创建一个继承自cook类的类的实体啦
对扩展开放对修改封闭是要将修改的内容减少到最少,但不是不修改啊,在最可能修改的地方做成这样的形式,有利于以后扩展功能。