设计模式开篇--设计模式的七大原则之开闭
关于设计模式的文章和书籍有很多,书籍的描述比较正式比较严肃,我希望能用自己的话去讲述明白它,我也正处于学习的初级阶段,这就是一个学习阶段的总结吧。
//注: 本系列仅仅是作者初学设计模式的总结,给初学者康一康的 // 严谨度不高,废话也有可能不少,主要是为了更好的理解 1. 学习设计模式从忘掉设计模式开始。 2. 结合生活场景和代码去理解。
从一开始学习面向对象的语言,我们就在理解什么是面向对象,从最开始的模仿着写类,到后来的驾轻就熟,拿到项目的第一反映是构建相关的对象类,我们对于设计模式和七大原则也是要从模仿开始,从模仿的过程中去深入了解本质。
面向对象的七大设计原则
- 开闭原则----对扩展开放,对修改关闭。
例如有一支笔,他有长度属性,有‘写’方法,通过写方法可以减少长度,每个时间段减少单位长度。Pen类如下:class Pen{ public int length; //长度 public void pen(int length){ //构造器 this.length = length; } public int getLength(){ return this.length; } public void written(int time){ //写 方法 this.length = this.length-time*1; } }
但是这样设计有什么不好的地方呢?//现在有个pen1对象 Pen pen1=new Pen(10); //并且呢,把这个对象给了其他类来使用(也就是说期望调用写方法去使用笔), //因为没有加权限设置这个时候其他类可以直接更改length=0而不走方法 pen1.length=0; int a = pen1.getLength(); pen.written(2);
所以,在设计阶段就应该考虑,这种直接修改的权限应该对外关闭
通过给属性public改private,限制外部访问,然后只允许通过written()的方式去进行使用class Pen{ private int length; //长度,私有 public void pen(int length){ this.length = length; } public int getLength(){ return this.length; } public void written(int time){ //写 方法,外部访问 this.length = this.length-time*1; } }
解决了对修改关闭,我们这样的设计就合理了吗?
如果此时告诉你,写方法有所变动,有的笔用的快,不是每个时间段减少单位长度,而是每个时间段减少两个单位长度?有的笔可以充墨,回复长度?
常规思路是我直接在写个pen2类,written()方法改一改,但是这样是不是就是浪费时间呢?明明有其他的代码没变化,而且都是pencil
而且在实现的时候,选择挑选哪个类实现对象也会眼花缭乱
开闭原则告诉我们,应尽量通过扩展软件实体的行为来实现变化, 而不是通过修改已有的代码来完成变化
我们可以写一个pencilwrite接口,包含written()方法,然后每个pen类实现接口,扩展新的written方法
也可以写一个pencilwrite接口,包含written()方法,然后实现一个基类pen类,其他不同的pencil就可以继承基类,再扩展方法具体实现不同功能。
- 里氏替换原则
- 依赖倒置原则
- 单一职责原则
- 接口隔离原则
- 迪米特法则
- 组合聚合复用原则