设计模式七大设计原则之开闭原则

设计模式七大设计原则之开闭原则(Open Close Principle)

1.开闭原则介绍

  1. 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭,用抽象构建框架,用实现扩展细节。
  2. 当软件实体需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

2.案例分析

场景: 人吃鱼和蔬菜
传统解决方法:
类图
在这里插入图片描述
代码实现:

package com.ldx.ocp;

public class OpenClose {
    public static void main(String[] args) {

        Person p = new Person();
        Fish f = new Fish();
        Vegetable vegetable=new Vegetable();
        p.eatFish(f);
        p.eatVegetable(vegetable);
    }
}

class Fish {
    public String eated() {
        return "鱼被吃了";
    }
}
class Vegetable{
    public String eated(){
        return "蔬菜被吃了";
    }
}

class Person {
    public void eatFish(Fish fish) {
        System.out.println("人在吃鱼," + fish.eated());
    }
    public void eatVegetable(Vegetable vegetable){
        System.out.println("人在吃蔬菜,"+vegetable.eated());
    }
}

运行结果:
在这里插入图片描述
当需要吃其他食物如水果时,这个程序就要修改很多地方,不仅要新建一个其他食物的类,Person这个类也要做修改,不满足开闭原则。

改进方案:用抽象构建框架,将食物抽象成一个接口,有个方法eated(),各种食物都实现这个接口即可
类图:
在这里插入图片描述
代码:

package com.ldx.ocp.improve;

public class OpenClose {
    public static void main(String[] args) {

        Person p = new Person();
        Fish f = new Fish();
        Vegetable vegetable = new Vegetable();
        OtherFood other = new OtherFood();

        p.eat(f);
        p.eat(vegetable);
        p.eat(other);
    }
}

interface Food {
    String eated();
}

class Fish implements Food {
    public String eated() {
        return "鱼被吃了";
    }
}

class Vegetable implements Food {
    public String eated() {
        return "蔬菜被吃了";
    }
}

class OtherFood implements Food {
    public String eated() {
        return "其他食物被吃了";
    }
}

class Person {
    public void eat(Food food) {
        System.out.println("人在吃食物," + food.eated());
    }
}

运行结果
在这里插入图片描述
小结:
开闭原则是程序设计的关键所在,要用抽象去构建框架,尽量通过扩展去解决程序需求变更问题,而不是通过修改原来的代码。

七大设计原则汇总:七大设计原则汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值