首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

java 设计方式 - 开闭原则

2013-07-11 
java 设计模式 - 开闭原则开闭原则算是前5中原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果

java 设计模式 - 开闭原则
开闭原则算是前5中原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固定的模式,但是最终保证的是提高程序的复用性、可维护性等要求。

开闭原则(Open Closed Principle)

开闭原则的核心是:对扩展开放,对修改关闭。

白话意思就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化。

开闭原则算是前5中原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固定的模式,但是最终保证的是提高程序的复用性、可维护性等要求。

要使用这一原则还需要结合着它的思想“对扩展开放,对修改关闭”与其他的五大设计原则根据经验来开发项目。

大体是这个意思,如果想深究,还需要看看其他的书籍。

下面是使用开闭原则的一个简单示例,虽有些不准确,但是是这个意思(领会精神)。

定义一个接口,寻找美女

  1. package?com.loulijun.chapter6; ?? ?
  2. public?interface?IFindGirl?{ ?????//年龄 ?
  3. ????public?int?getAge(); ?????//姓名 ?
  4. ????public?String?getName(); ?????//长相 ?
  5. ????public?String?getFace(); ?????//身材 ?
  6. ????public?String?getFigure(); ?}?

实现这个接口

  1. package?com.loulijun.chapter6; ?? ?
  2. public?class?FindGirl?implements?IFindGirl?{ ?????private?String?name; ?
  3. ????private?int?age; ?????private?String?face; ?
  4. ????private?String?figure; ?????? ?
  5. ????public?FindGirl(String?name,?int?age,?String?face,?String?figure) ?????{ ?
  6. ????????this.name?=?name; ?????????this.age?=?age; ?
  7. ????????this.face?=?face; ?????????this.figure?=?figure; ?
  8. ????} ?? ?
  9. ????@Override?????public?int?getAge()?{ ?
  10. ????????return?age; ?????} ?
  11. ? ?????@Override?
  12. ????public?String?getFace()?{ ?????????return?face; ?
  13. ????} ?? ?
  14. ????@Override?????public?String?getFigure()?{ ?
  15. ????????return?figure; ?????} ?
  16. ? ?????@Override?
  17. ????public?String?getName()?{ ?????????return?name; ?
  18. ????} ?????? ?
  19. ? ?}?

场景:大街上

  1. package?com.loulijun.chapter6; ?? ?
  2. import?java.text.NumberFormat; ?import?java.util.ArrayList; ?
  3. ? ?public?class?Street?{ ?
  4. ????private?final?static?ArrayList<IFindGirl>?girls?=?new?ArrayList<IFindGirl>(); ?????//静态初始化块 ?
  5. ????static?????{ ?
  6. ????????girls.add(new?FindGirl("张含韵",23,"可爱型","165cm/47kg")); ?????????girls.add(new?FindGirl("高圆圆",33,"时尚型","165cm/48kg")); ?
  7. ????????girls.add(new?FindGirl("章泽天",19,"清纯型","168cm/47kg")); ?????} ?
  8. ????public?static?void?main(String?args[]) ?????{ ?
  9. ????????System.out.println("----------美女在这里----------"); ?????????for(IFindGirl?girl:girls) ?
  10. ????????{ ?????????????System.out.println("姓名:"+girl.getName()+"?年龄:"+girl.getAge()+ ?
  11. ????????????????????"??长相:"+girl.getFace()+"??身材:"+girl.getFigure()); ?????????} ?
  12. ????} ?}?

运行结果:

----------美女在这里----------

姓名:张含韵 年龄:23 长相:可爱型 身材:165cm/47kg
姓名:高圆圆 年龄:33 长相:时尚型 身材:165cm/48kg
姓名:章泽天 年龄:19 长相:清纯型 身材:168cm/47kg

但是如果想独立分出一个外国美女的类别的话(比如增加一个国籍),可以通过修改接口、修改实现类、通过扩展来实现。

如果修改接口,也就意味着修改实现类,这样对项目的变动太大了,所以不推荐

如果修改实现类,这样虽能解决问题,但是明显有些牵强,如果需要其他变动的时候会显得逻辑混乱

所以,通过扩展来实现是最简单的方式

如何扩展:

可以定义一个IForeigner接口继承自IFindGirl,在IForeigner接口中添加国籍属性getCountry(),然后实现这个接口即可,然后就只需要在场景类中做稍微修改就可以了

  1. package?com.loulijun.chapter6; ?? ?
  2. public?interface?IForeigner?extends?IFindGirl?{ ?????//国籍 ?
  3. ????public?String?getCountry(); ?}?

实现接口

  1. package?com.loulijun.chapter6; ?? ?
  2. public?class?ForeignerGirl?implements?IForeigner?{ ?????private?String?name; ?
  3. ????private?int?age; ?????private?String?country; ?
  4. ????private?String?face; ?????private?String?figure; ?
  5. ????? ?????public?ForeignerGirl(String?name,?int?age,?String?country,?String?face,?String?figure) ?
  6. ????{ ?????????this.name?=?name; ?
  7. ????????this.age?=?age; ?????????this.country?=?country; ?
  8. ????????this.face?=face; ?????????this.figure?=?figure; ?
  9. ????} ?????@Override?
  10. ????public?String?getCountry()?{ ?????????//?TODO?Auto-generated?method?stub ?
  11. ????????return?country; ?????} ?
  12. ? ?????@Override?
  13. ????public?int?getAge()?{ ?????????//?TODO?Auto-generated?method?stub ?
  14. ????????return?age; ?????} ?
  15. ? ?????@Override?
  16. ????public?String?getFace()?{ ?????????//?TODO?Auto-generated?method?stub ?
  17. ????????return?face; ?????} ?
  18. ? ?????@Override?
  19. ????public?String?getFigure()?{ ?????????//?TODO?Auto-generated?method?stub ?
  20. ????????return?figure; ?????} ?
  21. ? ?????@Override?
  22. ????public?String?getName()?{ ?????????//?TODO?Auto-generated?method?stub ?
  23. ????????return?name; ?????} ?
  24. ? ?}?

然后在场景类中只需要修改如下代码即可,其他不变

  1. girls.add(new?ForeignerGirl("Avirl",28,"美国","性感型","160cm/45kg"));?

不过这些设计原则到不是绝对的,而是根据项目需求,实际需求来定夺使用。

原文链接:http://www.cnblogs.com/loulijun/archive/2012/03/14/2394055.html

热点排行