个人理解 ,随手写下的笔记。不足之处,请谅解。
定义
(1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。
(2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。
问题
任何软件都需要面临一个很重要的问题,即它们的需求会随时间的推移而发生变化。当软件系统需要面对新的需求时,我们应该尽量保证系统的设计框架是稳定的。如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。随着软件规模越来越大,软件寿命越来越长,软件维护成本越来越高,设计满足开闭原则的软件系统也变得越来越重要。
解决方式
为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成。在很多面向对象编程语言中都提供了接口、抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。
Java例子
/**
* 抽象类图标
*/
public abstract class AbsChat {
public void display() {
System.out.println("AbsChat");
}
}
/**
* 柱状图
*/
public class BarChat extends AbsChat {
@Override
public void display() {
System.out.println("BarChat");
}
}
/**
* 饼图
*/
public class PieChat extends AbsChat {
@Override
public void display() {
System.out.println("PieChat");
}
}
/**
* 系统调用图型显示
*/
public class ChatDisplay {
private AbsChat chat = null;
public ChatDisplay(AbsChat chat) {
this.chat = chat;
}
public void setChat(AbsChat chat) {
this.chat = chat;
}
public void display() {
chat.display();
}
}
/**
* 系统调用相应的图型显示
*/
public class TestDemo {
public static void main(String[] args) {
//修改系统代码的时候替换BarChat就好了,如果使用Spring框架替换Bean配置就好了,不用修改代码,直接添加代码就好了
AbsChat chat = new BarChat();
// AbsChat chat = new PieChat();
ChatDisplay chatDisplay = new ChatDisplay(chat);
chatDisplay.display();
}
}
网友评论