立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广州大学城网业务调整

[Java/JSP] 设计模式6大原则:开闭原则 [复制链接] qrcode

查看: 3500 | 回复: 0

大法师的 该用户已被删除
发表于: 2012-12-27 15:18:37 | 显示全部楼层

开闭原则(Open Closed Principle
开闭原则的核心是:对扩展开放,对修改关闭。
白话意思就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化。
开闭原则算是前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<IFindGirl> girls = new ArrayList<IFindGirl>();  
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
  疯狂软件官网:http://www.fkjava.org
  疯狂java视频 android视频:http://www.fkjava.org/video.html





跳转到指定楼层
快速回复 返回顶部 返回列表