说个不恰当的例子吧。小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让我添加其他功能会不会影响到这些类?当你想清楚了,那么恭喜你,你已经完美使用了设计模式。
开放封闭模式这个界限太模糊了,要是太封闭了,那就只有女朋友,也不好。人活一世,广交朋友。所谓,海内存知己,天涯若比邻。