主题:设计模式6大原则:开闭原则
开闭原则的核心是:对扩展开放,对修改关闭。
白话意思就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化。
开闭原则算是前5中原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固定的模式,但是最终保证的是提高程序的复用性、可维护性等要求。
要使用这一原则还需要结合着它的思想“对扩展开放,对修改关闭”与其他的五大设计原则根据经验来开发项目。
大体是这个意思,如果想深究,还需要看看其他的书籍。
下面是使用开闭原则的一个简单示例,虽有些不准确,但是是这个意思(领会精神)。
定义一个接口,寻找美女
1. package com.loulijun.chapter6;
2.
3. public interface IFindGirl {
4. //年龄
5. public int getAge();
6. //姓名
7. public String getName();
8. //长相
9. public String getFace();
10. //身材
11. public String getFigure();
12. }
实现这个接口
1. package com.loulijun.chapter6;
2.
3. public class FindGirl implements IFindGirl {
4. private String name;
5. private int age;
6. private String face;
7. private String figure;
8.
9. public FindGirl(String name, int age, String face, String figure)
10. {
11. this.name = name;
12. this.age = age;
13. this.face = face;
14. this.figure = figure;
15. }
16.
17. @Override
18. public int getAge() {
19. return age;
20. }
21.
22. @Override
23. public String getFace() {
24. return face;
25. }
26.
27. @Override
28. public String getFigure() {
29. return figure;
30. }
31.
32. @Override
33. public String getName() {
34. return name;
35. }
36.
37.
38. }
场景:大街上
1. package com.loulijun.chapter6;
2.
3. import java.text.NumberFormat;
4. import java.util.ArrayList;
5.
6. public class Street {
7. private final static ArrayList
8. //静态初始化块
9. static
10. {
11. girls.add(new FindGirl("张含韵",23,"可爱型","165cm/47kg"));
12. girls.add(new FindGirl("高圆圆",33,"时尚型","165cm/48kg"));
13. girls.add(new FindGirl("章泽天",19,"清纯型","168cm/47kg"));
14. }
15. public static void main(String args[])
16. {
17. System.out.println("----------美女在这里----------");
18. for(IFindGirl girl:girls)
19. {
20. System.out.println("姓名:"+girl.getName()+" 年龄:"+girl.getAge()+
21. " 长相:"+girl.getFace()+" 身材:"+girl.getFigure());
22. }
23. }
24. }
运行结果:
----------美女在这里----------
姓名:张含韵 年龄:23 长相:可爱型身材:165cm/47kg
姓名:高圆圆 年龄:33 长相:时尚型 身材:165cm/48kg
姓名:章泽天 年龄:19 长相:清纯型 身材:168cm/47kg
但是如果想独立分出一个外国美女的类别的话(比如增加一个国籍),可以通过修改接口、修改实现类、通过扩展来实现。
如果修改接口,也就意味着修改实现类,这样对项目的变动太大了,所以不推荐
如果修改实现类,这样虽能解决问题,但是明显有些牵强,如果需要其他变动的时候会显得逻辑混乱
所以,通过扩展来实现是最简单的方式
如何扩展:
可以定义一个IForeigner接口继承自IFindGirl,在IForeigner接口中添加国籍属性getCountry(),然后实现这个接口即可,然后就只需要在场景类中做稍微修改就可以了
1. package com.loulijun.chapter6;
2.
3. public interface IForeigner extends IFindGirl {
4. //国籍
5. public String getCountry();
6. }
实现接口
1. package com.loulijun.chapter6;
2.
3. public class ForeignerGirl implements IForeigner {
4. private String name;
5. private int age;
6. private String country;
7. private String face;
8. private String figure;
9.
10. public ForeignerGirl(String name, int age, String country, String face, String figure)
11. {
12. this.name = name;
13. this.age = age;
14. this.country = country;
15. this.face =face;
16. this.figure = figure;
17. }
18. @Override
19. public String getCountry() {
20. // TODO Auto-generated method stub
21. return country;
22. }
23.
24. @Override
25. public int getAge() {
26. // TODO Auto-generated method stub
27. return age;
28. }
29.
30. @Override
31. public String getFace() {
32. // TODO Auto-generated method stub
33. return face;
34. }
35.
36. @Override
37. public String getFigure() {
38. // TODO Auto-generated method stub
39. return figure;
40. }
41.
42. @Override
43. public String getName() {
44. // TODO Auto-generated method stub
45. return name;
46. }
47.
48. }
然后在场景类中只需要修改如下代码即可,其他不变
1. girls.add(new ForeignerGirl("Avirl",28,"美国","性感型","160cm/45kg"));
不过这些设计原则到不是绝对的,而是根据项目需求,实际需求来定夺使用。
QQ 744437114
疯狂软件官网:www.fkjava.org
疯狂java视频 android视频:http://www.fkjava.org/video.html