博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式--6大原则--开闭原则
阅读量:4961 次
发布时间:2019-06-12

本文共 3191 字,大约阅读时间需要 10 分钟。

开闭原则(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
girls = new ArrayList
(); //静态初始化块 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"));

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

 

转载于:https://www.cnblogs.com/loulijun/archive/2012/03/14/2394055.html

你可能感兴趣的文章
React + Redux 入门(一):抛开 React 学 Redux
查看>>
13位时间戳和时间格式化转换,工具类
查看>>
vue router-link子级返回父级页面
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
div 只显示两行超出部分隐藏
查看>>
C#小练习ⅲ
查看>>
电源防反接保护电路
查看>>
arraylist
查看>>
zoj 1649 Rescue (BFS)(转载)
查看>>
2124: 等差子序列 - BZOJ
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
【设计模式】工厂模式
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
客户数据库出现大量cache buffer chains latch
查看>>
機械の総合病院 [MISSION LEVEL: C]
查看>>
实战练习细节(分行/拼接字符串/字符串转int/weak和copy)
查看>>
Strict Standards: Only variables should be passed by reference
查看>>
hiho_offer收割18_题解报告_差第四题
查看>>