设计模式--6大原则--开闭原则
开闭原则(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"));
 
不过这些设计原则到不是绝对的,而是根据项目需求,实际需求来定夺使用
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/9120531
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)