您的位置:首页 > 其它

设计模式六大原则-开闭原则

2013-06-19 14:16 375 查看
今天去面试,碰到一个专业名词——开闭原则(Open Closed Principle)

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

意思就是:如果后期或者二次开发时,需要对软件改变(如扩展功能),应该通过扩展的方式达到目的,不应该修改原来代码实现目的。

查阅资料,开闭原则是前面五种原则的一个抽象总结,前五种原则是开闭原则的具体实现。有人说开闭原则有点虚,是因为它没有一个固定的模式,但是最终保证的是提高程序的复用性、可维护性等要求。

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

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

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

定义一个接口,寻找美女

package com.loulijun.chapter6;

public interface IFindGirl {
//年龄
public int getAge();
//姓名
public String getName();
//长相
public String getFace();
//身材
public String getFigure();
}

实现这个接口

package com.loulijun.chapter6;

public class FindGirl implements IFindGirl {
private String name;
private int age;
private String face;
private String figure;

public FindGirl(String name, int age, String face, String figure)
{
this.name = name;
this.age = age;
this.face = face;
this.figure = figure;
}

@Override
public int getAge() {
return age;
}

@Override
public String getFace() {
return face;
}

@Override
public String getFigure() {
return figure;
}

@Override
public String getName() {
return name;
}
}

场景:大街上

package com.loulijun.chapter6;

import java.text.NumberFormat;
import java.util.ArrayList;

public class Street {
private final static ArrayList<IFindGirl> girls = new ArrayList<IFindGirl>();
//静态初始化块
static
{
girls.add(new FindGirl("张含韵",23,"可爱型","165cm/47kg"));
girls.add(new FindGirl("高圆圆",33,"时尚型","165cm/48kg"));
girls.add(new FindGirl("章泽天",19,"清纯型","168cm/47kg"));
}
public static void main(String args[])
{
System.out.println("----------美女在这里----------");
for(IFindGirl girl:girls)
{
System.out.println("姓名:"+girl.getName()+" 年龄:"+girl.getAge()+
"  长相:"+girl.getFace()+"  身材:"+girl.getFigure());
}
}
}

运行结果:

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

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

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

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

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

如何扩展:

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

package com.loulijun.chapter6;

public interface IForeigner extends IFindGirl {
//国籍
public String getCountry();
}

实现接口

package com.loulijun.chapter6;

public class ForeignerGirl implements IForeigner {
private String name;
private int age;
private String country;
private String face;
private String figure;

public ForeignerGirl(String name, int age, String country, String face, String figure)
{
this.name = name;
this.age = age;
this.country = country;
this.face =face;
this.figure = figure;
}
@Override
public String getCountry() {
// TODO Auto-generated method stub
return country;
}

@Override
public int getAge() {
// TODO Auto-generated method stub
return age;
}

@Override
public String getFace() {
// TODO Auto-generated method stub
return face;
}

@Override
public String getFigure() {
// TODO Auto-generated method stub
return figure;
}

@Override
public String getName() {
// TODO Auto-generated method stub
return name;
}
}

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

girls.add(new ForeignerGirl("Avirl",28,"美国","性感型","160cm/45kg"));
不过这些设计原则到不是绝对的,而是根据项目需求,实际需求来定夺使用。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: