第四话-开放封闭原则

说个不恰当的例子吧。小A是一个风度翩翩的美男子,喜得N多美女喜欢。他呢一向很开放,性格随和,所以和身边的美女同学都很亲近,说不清是爱情还是友情。这是N多少年的梦想啊,谁不想身边美女如云啊?终于有一天,小A交女朋友了。女友可谓风姿卓越,沉鱼落雁。是不是很狗血的剧情?不要急,咱们不是为了讲故事。可是小A开放惯了,不懂得封闭。还是和身边的女生们很随和。一致,女朋友生气。后果很严重。

为什么会这样呢?因为爱情是唯一的是不可侵犯的,是不可分享的,是私有的霸占的。应该是对外封闭的。小A就是不懂得去把握开放封闭原则。那么什么是开放封闭原则呢?请看下文。

一、什么是开放封闭原则?

所谓开放封闭原则就是说,软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

当你写好一个程序,你里面的类是相互独立的,并且是对一些毁灭性的更改是封闭的,但他可以被扩展。正如,第一话中的计算器的例子,如果开始你只是写了一个计算加法的程序,当要添加减法的功能时,你不能去修改做加法运算的类,但你可以去扩展他,继承他重写其方法等等方法解决。

所以说你写程序时要遇见未来,把一个类写成可扩展的,但不能轻易修改的。

都说开放封闭原则是面向对象设计的核心,这话不假。还不明白,怎么办?

突然想到一个笑话,你可以去北大青鸟学一年,再去蓝翔学一年,再去新东方学一年,出来你就可以用电脑控制挖掘机炒菜了。是不是很高端大气上档次?

二、应用于什么场合?

1、面向程序设计的方方面面;

2、业务逻辑比较庞大的系统等。

三、上代码(银行业务系统)

其实咱们之前写的那几个例子已经使用了开放封闭的原则。呵呵,是不是好多你都是以前用过,只是不知道名字而已。

在银行,如果每个窗口都进行存取等多项业务,那么业务处理者必须非常熟悉各项业务,并且需要高度认真不能给别人办错了业务,他的桌面也将需要N多东西。

但是如果把这些业务分离开,一个窗口时一种业务,那将提高多少效率,工作人员也轻松了,人们也不用等那么久了。

Bank.java

public interface Bank {

public void work(int money);

}

Deposit.java

public class Deposit implements Bank {

public void work(int money) {

// TODO Auto-generated method stub

System.out.println("您存了"+money+"元整");

}

}

Widthdraw.java

public class Withdraw implements Bank {

public void work(int money) {

// TODO Auto-generated method stub

System.out.println("您取了" + money + "元整");

}

}

BankFactory.java

//工厂类,是不是很熟悉,对,简单工厂模式

public class BankFactory {

public static Bank createBank(String choice) {

Bank bank = null;

if (choice.equals("withdraw")) {

bank = new Withdraw();

} else if (choice.equals("deposit")) {

bank = new Deposit();

}

return bank;

}

}

Main.java

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Bank worker1 = BankFactory.createBank("withdraw");

worker1.work(10000);

Bank worker2 = BankFactory.createBank("deposit");

worker2.work(20000);

}

}

四、小结

原则都是人定的,要活学活用。学习设计模式是为了设计出高质量的代码,让其易维护,易扩展,易重用,灵活清晰等等。这是共同的追求,如果我们有自己的业务需求有自己的思想,就是感觉这样做是好的,那么恭喜你你感觉错了。要是你问自己几个问题,我的类可以分成多个类么?我的类需不需要分成多个类?万一Boss让我添加其他功能会不会影响到这些类?当你想清楚了,那么恭喜你,你已经完美使用了设计模式。

开放封闭模式这个界限太模糊了,要是太封闭了,那就只有女朋友,也不好。人活一世,广交朋友。所谓,海内存知己,天涯若比邻。

时间: 2024-10-14 22:09:25

第四话-开放封闭原则的相关文章

设计模式 之 设计的 六大原则(6) 开放封闭原则

  开放封闭原则  定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统.开闭原则可能是设计模式六项原则中定义最模糊的一个了,

设计模式六大原则: 一国两制 -- 开放封闭原则

"一国两制"指的是在中华人民共和国内,国家的主体实行社会主义,香港.澳门和台湾实行资本主义. 中国共产党为解决祖国内地和台湾和平统一的问题以及在香港.澳门恢复行使中国主权的问题而提出的基本国策.即在中华人民共和国内,内地坚持社会主义制度作为整个国家的主体,同时允许台湾.香港.澳门保留资本主义制度. 现代化建设的设计师-邓小平先生一定学过设计模式,他的 开放封闭原则用地炉火纯青啊: - 首先中国大陆的社会主义方针是坚定不移的 - 这时香港.澳门这两个在富人家过惯了的孩子又不肯回来过社会主

大话设计模式1.0.2-----策略模式 单一职责原则 和 开放-封闭原则

大话设计模式第二章之:策略模式 算法之间可以互相调用 策略模式就是用来封装算法的. 大话设计模式第三章之:单一职责原则 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因 类承担的职责不能过多,因为有时,完成一个职责,会影响到其他职责的, 手机只用来接电话,相机只用来拍照,功能才强大,集成太多了,其他功能就弱化了. 对应一些问题,要方法化,要类分离化 大话设计模式第四章之:开放-封闭原则 开放-封闭原则:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改.OCP 扩展是开放的,修

面象对象设计6大原则之二:开放封闭原则

定义 一个软件的实体,包括类.方法.模块.应该对扩展开放,对修改关闭. 也就是说一个软件的实体应该通过扩展的方式来修改变化,而不是修改已有实体源代码. 开放封闭原则也是最基本需要遵守的原则,我们应该尽量保证系统的稳定性,我们在实现另外一个功能的时候不能修改之前已有的代码以免造成之前的功能出现BUG,带来不必要的麻烦,所以开放封闭原则正是引导我们去设计一个稳定.方便扩展的系统. 在实际应用中我们一般会有以下几种做法保证开放封闭原则: 1.抽象出一个接口或者抽象类,定义公共的方法,达到扩展的目的.实

敏捷软件开发 – OCP 开放-封闭原则

软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改的. 如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就具有僵化性的臭味.OCP建议我们应该对系统进行重构,这样以后对系统再进行这样那样的改动时,就不会导致更多的修改.如果正确地应用OCP,那么以后再进行同样的改动时,就只需要添加新的代码,而不必改动已经正常运行的代码. OCP概述 遵循开放-封闭原则设计出的模块具有两个主要的特征.它们是: 对于扩展是开放的(open for extension).这意味着模块的行

敏捷软件开发——开放—封闭原则(OCP)

由来: 怎么样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一版本以后不断推出新的版本呢?bertrand meyer 在1988年提出的著名的开发-封闭原则(the open-closed princle)为我们提供了指引. 遵循开放-封闭原则设计出的模块具有两个主要特征: 1. "对于扩张是开放的"(open for extension) 这以为着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的行为.也就是说,我们可以改变

开放-封闭原则

开放-关闭原则:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改[ASD].这其实说明了两个特征,一个是"对于扩展是开放的(Open for extension)",另一个是"对于更改是封闭的(Closed for modification)"[ASD]. 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况.对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改. 开放-封闭原则是面向对象设计的核心所在.

开放封闭原则

What 开放封闭原则(Open-Closed Principle:OCP),对于扩展是开放的,对于修改是封闭的.软件设计的目标:封装变化.降低耦合,而OCP正是这目标最直接的提现之一. Why OCP优点就是不会对已有的代码造成影响,减小测试的范围,以及代码的稳定性. How 下面不符合OCP的设计,为什么这样说:如果银行业务需要增加其他的功能,比如转账业务,那么我们需要修改BankProcess类,违反了对于修改是封闭的 class BankProcess { //存款 public voi

《大话设计模式》:开放-封闭原则

开放-封闭原则:软件实体(类.模块.函数等等)应该可以扩展,但是不可以修改.对于扩展是开放的,对于更改是封闭的. 针对的问题:怎样的设计才能面对需求的改变却可以保持相对的稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢? 无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化,既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出抉择,他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化. 在我们最初编写代码时,假设变化不会发生.当变化发生时,我们就创建抽象