设计模式开篇--设计模式的七大原则之开闭

关于设计模式的文章和书籍有很多,书籍的描述比较正式比较严肃,我希望能用自己的话去讲述明白它,我也正处于学习的初级阶段,这就是一个学习阶段的总结吧。

//注: 本系列仅仅是作者初学设计模式的总结,给初学者康一康的
//    严谨度不高,废话也有可能不少,主要是为了更好的理解
1. 学习设计模式从忘掉设计模式开始。
2. 结合生活场景和代码去理解。

从一开始学习面向对象的语言,我们就在理解什么是面向对象,从最开始的模仿着写类,到后来的驾轻就熟,拿到项目的第一反映是构建相关的对象类,我们对于设计模式和七大原则也是要从模仿开始,从模仿的过程中去深入了解本质。

面向对象的七大设计原则

  1. 开闭原则----对扩展开放,对修改关闭。
    例如有一支笔,他有长度属性,有‘写’方法,通过写方法可以减少长度,每个时间段减少单位长度。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就可以继承基类,再扩展方法具体实现不同功能。
  1. 里氏替换原则
  2. 依赖倒置原则
  3. 单一职责原则
  4. 接口隔离原则
  5. 迪米特法则
  6. 组合聚合复用原则
全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务