为什么作文应遵循“开放延伸,接近修改”原则?
我理解:如果你想在课堂上添加功能,你只需编写新代码并使用合成来获得该代码。
但是你只是修改了你有一个合成的代码吗?因为您将组合添加到该代码中,因此您可以修改该代码。
示例:
之前,就是这样:
public class Example{
public void Walk(){
//walking
}
}
之后:
public class Example{
RunClass r = new RunClass(); // I add this
public void Walk(){
//walking
}
public void Run(){ // I also add this
r.run();
}
}
所以这意味着我修改了这个类。
答案 0 :(得分:2)
您没有以OCP方式使用合成。
这将是OCP之后的事情:
public class Example2{
Example e = new Example();
RunClass r = new RunClass();
public void Walk(){
e.Walk()
}
public void Run(){
r.run();
}
}
另一种方法是Example2
继承Example
:
public class Example2 extends Example{
RunClass r = new RunClass();
public void Run(){
r.run();
}
}
Example
不会更改,但会被Example2
组成。
答案 1 :(得分:1)
您需要首先查看定义 构成只是一种“有”关系,而继承则是“是一种”关系。 开放封闭原则是关于改变行为而不改变类的源代码。它们本身并不能确保OCP 设计模式遵循原则通过组合或/和继承。例如。策略设计模式使用组合在运行时更改行为,而模板方法模式使用继承在编译时更改行为。因此,组合允许在运行时进行扩展,因此继承允许在编译时进行扩展。如果您希望您的课程被密封(不能被分类),唯一可用的选项是组合 除非您的设计松散耦合,否则OCP不能通过构图确保。请记住,组合只是一个“有一个”关系,它只是说你的类有一个对象的实例,但是如果你必须修改你的代码来改变那个实例,那就不会遵循OCP。但是,如果使用控制反转(IoC),则该组合将变得松散耦合,因此您无需更改类中的代码。这是一个例子:
不遵循OCP的组合
public class Bike {
Wheel wheel = new LargeWheel();
public void go(){
wheel.go();
}
遵循OCP(通过IoC)的组成
public class Bike {
Wheel wheel;
public setWheel(Wheel wheel){
this.wheel = wheel;
}
public void go(){
wheel.go();
}
在第一种情况下,如果您需要不同类型的滚轮,则需要修改代码,但在第二种情况下,您需要“注入”所需的滚轮实例。
答案 2 :(得分:0)
当你将它应用于没有源代码的类时,open-closed的要点是明确的,它只是作为依赖项出现在JAR中。该类肯定关闭进行修改 - 您只能按原样使用它。 open 部分意味着该类的设计应使您的消费者能够扩展其行为以满足您的需求。组合是使用该类并添加自己的行为的一种方式。