浅谈设计原则OCP

本文深入探讨了开放-封闭原则(OCP),解释了其核心概念和关键特征,通过实例展示了如何在软件设计中遵循此原则以实现模块的可扩展性而不修改现有代码。同时,提出了通过抽象和接口设计来实现OCP的有效方法,并讨论了如何应对软件需求变化时的扩展问题。

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

OCP(The Open-Close Principle, 开放-封闭原则)

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

对于扩展是开放的(Open for extension)


模块的行为可以扩展,当应用的需求改变时,可以对模块进行扩展,以满足新的需求


对于更改是封闭的(Closed for modification)


对模块行为扩展时,不必改动模块的源代码或二进制代码


OCP的关键在于抽象

OCP的关键在于抽象


抽象技术:abstract class, Interface


抽象预见了可能的所有扩展(闭) 【PS:抽象出不变的】


由抽象可以随时导出新的类(开) 【PS:  变化的交给子类】


aa    vv


范例:手与门

如何在程序中模拟用手去开门和关门?

行为:

开门(open)

关门(close)

判断门的状态(isOpened)                  cc





设计与实现


public class Door {
    private boolean _isOpen=false;
    public boolean isOpen(){
        return _isOpen;
    }
    public void open(){
        _isOpen = true;
    }
    public void close(){
        _isOpen = false;
    }
}


public class Hand {
    public Door door;
    void do() {
        if (door.isOpen())
             door.close();
        else
            door.open();
    }
}

public class SmartTest {
    public static void main(String[] args) {
        Hand myHand = new Hand();
        myHand.door = new Door();
        myHand.do();
    }
}

虽然实现了,但是如果有新的需求我们要改写代码


新的需求……


需要手去开关抽屉,冰箱……?


我们只好去修改程序!



public class Hand {
    public Door door;
    public Drawer drawer;
    void do(int item) {
        switch (item){
            case 1:
                if (door.isOpen())
                     door.close();
                else   door.open();
                break;
	case 2:
 	    if (drawer.isOpen())
                      drawer.close();
                 else  drawer.open();
           break; 
        }
    }
}

符合OCP的设计方案




public interface Excutable {
    public boolean isOpen();
    public void open();
    public void close();
}


新的实现


public class Door implements Excutable {
    private boolean _isOpen = false;
    public boolean isOpen() {
        return _isOpen;
    }
    public void open() {
        _isOpen = true;
    }
    public void close() {
        _isOpen = false;
    }
}


public class Drawer implements Excutable {
    private boolean _isOpen = false;
    public boolean isOpen() {
        return _isOpen;
    }
    public void open() {
        _isOpen = true;
    }
    public void close() {
        _isOpen = false;
    }
}

public class Hand {
    public Excutable item;
    void do() {
        if (item.isOpen())
            item.close();
        else
            item.open();
    }
}


其实笔者认为,开闭原则无非就是想表达这样一层意思:用抽象构建框架,用实现扩展细节。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了。当然前提是我们的抽象要合理,要对需求的变更有前瞻性和预见性才行。【PS:具有前瞻性的设计类结构,而不是盲目在于实现,抽象的好,自然就可以直接派生了】



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值