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

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

什么是开闭原则

开闭原则是编程中最基础、最重要的设计原则,是设计模式的核心。

开闭原则是指:对扩展开放,对修改封闭。

也就是说,当软件需要变化时,尽量通过扩展软件实体的行为的方法来实现,而不是在现有代码的基础上做出修改来实现。

举个栗子

假设现在我们希望有一个类,可以根据传入的类不同,输出其类型:

public class Ocp {
    public static void main(String[] args) {
        Worker worker = new Worker();
        worker.work(new A());
        worker.work(new B());
    }
}

class Worker {
    public void work(Base base) {
        if (base instanceof A) {
            print1();
        } else if (base instanceof B) {
            print2();
        }
    }

    public void print1() {
        System.out.println("这是A类");
    }

    public void print2() {
        System.out.println("这是B类");
    }
}

class Base { }

class A extends Base { }

class B extends Base { }

现在我们希望添加一个C类,我们就需要改变我们的代码:

public class Ocp {
    public static void main(String[] args) {
        Worker worker = new Worker();
        worker.work(new A());
        worker.work(new B());
        worker.work(new C());
    }
}

class Worker {
    public void work(Base base) {
        if (base instanceof A) {
            print1();
        } else if (base instanceof B) {
            print2();
        } else if (base instanceof C) {
            print3();
        }
    }

    public void print1() {
        System.out.println("这是A类");
    }

    public void print2() {
        System.out.println("这是B类");
    }

    public void print3() {
        System.out.println("这是C类");
    }
}

class Base { }

class A extends Base { }

class B extends Base { }

class C extends Base { }

这里面有着过多的改动,我们添加了一个类,修改了Worker类里的work逻辑,并增加了一个新的方法,如果功能更复杂的话要改动的东西太多,不利于维护。现在的代码是对修改开放的,并不符合开闭原则


下面的代码是符合开闭原则的:

class Worker {
    public void work(Base base) {
        base.print();
    }
}

abstract class Base {
    public abstract void print();
}

class A extends Base {
    @Override
    public void print() {
        System.out.println("这是A类");
    }
}

class B extends Base {
    @Override
    public void print() {
        System.out.println("这是B类");
    }
}

class C extends Base {
    @Override
    public void print() {
        System.out.println("这是C类");
    }
}

对于现在的代码来说,将Base作为一个抽象类,让子类重写其print方法,如果需要添加新的功能,仅需要继承Base类即可,Worker类中的work方法也仅仅是调用一下base的print方法,不会因为新增功能而被迫改变,对扩展开放,对修改封闭,符合开闭原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值