设计模式--6大原则--开闭原则

举报
ShaderJoy 发表于 2021/12/29 23:54:13 2021/12/29
【摘要】 开闭原则(Open Closed Principle) 开闭原则的核心是:对扩展开放,对修改关闭白话意思就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应该修改原有代码来实现变化 开闭原则算是前五种原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固...

开闭原则(Open Closed Principle)


开闭原则的核心是:对扩展开放,对修改关闭

白话意思就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应该修改原有代码来实现变化

开闭原则算是前五种原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固定的模式,但是最终保证的是提高程序的复用性、可维护性等要求

要使用这一原则还需要结合着它的思想“对扩展开放,对修改关闭”与其他的五大设计原则根据经验来开发项目

大体是这个意思,如果想深究,还需要看看其他的书籍

下面是使用开闭原则的一个简单示例,虽有些不准确,但是是这个意思(领会精神)

定义一个接口,寻找美女

 


  
  1. package com.loulijun.chapter6;
  2. public interface IFindGirl {
  3. //年龄
  4. public int getAge();
  5. //姓名
  6. public String getName();
  7. //长相
  8. public String getFace();
  9. //身材
  10. public String getFigure();
  11. }

实现这个接口

 


  
  1. package com.loulijun.chapter6;
  2. public class FindGirl implements IFindGirl {
  3. private String name;
  4. private int age;
  5. private String face;
  6. private String figure;
  7. public FindGirl(String name, int age, String face, String figure)
  8. {
  9. this.name = name;
  10. this.age = age;
  11. this.face = face;
  12. this.figure = figure;
  13. }
  14. @Override
  15. public int getAge() {
  16. return age;
  17. }
  18. @Override
  19. public String getFace() {
  20. return face;
  21. }
  22. @Override
  23. public String getFigure() {
  24. return figure;
  25. }
  26. @Override
  27. public String getName() {
  28. return name;
  29. }
  30. }


场景:大街上

 


  
  1. package com.loulijun.chapter6;
  2. import java.text.NumberFormat;
  3. import java.util.ArrayList;
  4. public class Street {
  5. private final static ArrayList<IFindGirl> girls = new ArrayList<IFindGirl>();
  6. //静态初始化块
  7. static
  8. {
  9. girls.add(new FindGirl("张含韵",23,"可爱型","165cm/47kg"));
  10. girls.add(new FindGirl("高圆圆",33,"时尚型","165cm/48kg"));
  11. girls.add(new FindGirl("章泽天",19,"清纯型","168cm/47kg"));
  12. }
  13. public static void main(String args[])
  14. {
  15. System.out.println("----------美女在这里----------");
  16. for(IFindGirl girl:girls)
  17. {
  18. System.out.println("姓名:"+girl.getName()+" 年龄:"+girl.getAge()+
  19. " 长相:"+girl.getFace()+" 身材:"+girl.getFigure());
  20. }
  21. }
  22. }

运行结果:


  
  1. ----------美女在这里----------
  2. 姓名:张含韵 年龄:23 长相:可爱型 身材:165cm/47kg
  3. 姓名:高圆圆 年龄:33 长相:时尚型 身材:165cm/48kg
  4. 姓名:章泽天 年龄:19 长相:清纯型 身材:168cm/47kg

但是如果想独立分出一个外国美女的类别的话(比如增加一个国籍),可以通过修改接口、修改实现类、扩展来实现。

如果修改接口,也就意味着修改实现类,这样对项目的变动太大了,所以不推荐

如果修改实现类,这样虽能解决问题,但是明显有些牵强,如果需要其他变动的时候会显得逻辑混乱

所以,通过扩展来实现是最简单的方式

如何扩展:

可以定义一个 IForeigner 接口继承自 IFindGirl,在 IForeigner 接口中添加国籍属性 getCountry(),然后实现这个接口即可,然后就只需要在场景类中做稍微修改就可以了


  
  1. package com.loulijun.chapter6;
  2. public interface IForeigner extends IFindGirl {
  3. //国籍
  4. public String getCountry();
  5. }

实现该新接口

 


  
  1. package com.loulijun.chapter6;
  2. public class ForeignerGirl implements IForeigner {
  3. private String name;
  4. private int age;
  5. private String country;
  6. private String face;
  7. private String figure;
  8. public ForeignerGirl(String name, int age, String country, String face, String figure)
  9. {
  10. this.name = name;
  11. this.age = age;
  12. this.country = country;
  13. this.face =face;
  14. this.figure = figure;
  15. }
  16. @Override
  17. public String getCountry() {
  18. // TODO Auto-generated method stub
  19. return country;
  20. }
  21. @Override
  22. public int getAge() {
  23. // TODO Auto-generated method stub
  24. return age;
  25. }
  26. @Override
  27. public String getFace() {
  28. // TODO Auto-generated method stub
  29. return face;
  30. }
  31. @Override
  32. public String getFigure() {
  33. // TODO Auto-generated method stub
  34. return figure;
  35. }
  36. @Override
  37. public String getName() {
  38. // TODO Auto-generated method stub
  39. return name;
  40. }
  41. }

然后在场景类中只需要修改如下代码即可,其他不变

 

girls.add(new ForeignerGirl("Avirl",28,"美国","性感型","160cm/45kg"));
 

 

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

 

 

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/9120531

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。