开放封闭原版OCP

本文介绍了软件设计中的开放封闭原则(OCP),强调了软件实体应当可扩展但不可修改。通过具体的图形绘制实例,展示了如何通过引入抽象基类实现模块的扩展性而不改动原有代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件实体(类、模块、函数等等)应该是可以扩展的,但是应该是不可修改的。

说明:开放封闭原则是指对扩展开放,当应用的需求更改时,可以对模块进行扩展;封闭是指对更改是封闭的,不改动原有的列库。

关键:抽象

创建出固定却能够描述一组任意个可能行为的抽象体,抽象体为抽象基类。模块操作一个抽象体,由于模块依赖于一个特定的抽象体,所以对于它的更改是可以关闭的,同时,通过此抽象体派生,可以扩展模块行为。

比如:
下图展示了一个简单不遵循OCP原则的设计,Person和Rose都是具体类,Person类使用具体类。如果我们现在希望Person能够使用其他Flower类,就必须把Person中使用Rose的地方换成其他类。
这里写图片描述

现在将设计进行重新设计成如下,Person类使用FlowerInterface接口,不同的Flower类可以实现该接口,这种情况下就不用修改Person类。FlowerInterface描述行为,由具体类去实现它们。
这里写图片描述

接下来会通过具体的代码示例进行描述开放封闭原则:

现在需要在一个标准的GUI上绘制圆和正方形,下面对它违反OCP原则以及遵循OCP原则的部分核心代码进行展示。

违反OCP原则:

case square:
    drawSquare();
    break;
case circle:
    drawCircle();
    break;

在应用程序中通过switch语句去选择绘制图形的操作,现在若是添加一个新类型,如何更改此应用程序。

遵循OCP原则:

void draw(Vector<Shape> shapes){
Iterator it = (Iterator)shapes;
while (iterator.hasNext()){
            iterator.next().draw();
}
}

在这里增加一个其他形状,不需要修改此函数。

OCP原则的关键在于寻找合适的抽象,一个应用程序可能做不到完全封闭,所以需要有选择性地进行抽象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值