开闭原则(Open Closed Principle)
开闭原则的核心是:对扩展开放,对改动关闭
白话意思就是我们改变一个软件时(比方扩展其它功能)。应该通过扩展的方式来达到软件的改变,而不应爱改动原有代码来实现变化
开闭原则算是前5中原则的一个抽象总结。前五种是开闭原则的一些详细实现,所以假设使用开闭原则,事实上有点虚,由于它没有一个固定的模式,可是终于保证的是提高程序的复用性、可维护性等要求
要使用这一原则还须要结合着它的思想“对扩展开放,对改动关闭”与其它的五大设计原则依据经验来开发项目
大体是这个意思,假设想深究。还须要看看其它的书籍
以下是使用开闭原则的一个简单演示样例,虽有些不准确,可是是这个意思(领会精神)
定义一个接口。寻找美女
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" ));
|
只是这些设计原则到不是绝对的,而是依据项目需求,实际需求来定夺使用