ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【设计模式】开闭原则

2021-12-28 13:33:02  阅读:143  来源: 互联网

标签:原则 type void public print 设计模式 Email2 class 开闭


开闭原则

  1. 开闭原则是编程中最基础最重要的设计原则
  2. 一个软件实体如类,模块和函数应该对扩展开放**(对提供方),对修改关闭(对使用方)**。用抽象构建框架,用实
现扩展细节。
  3. 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
  4. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

看如下的例子,如果要求再扩展一个功能,比如利用163发,那么需要在添加一个类,在sendEmail中添加一个方法,在同类print中继续添加代码。这就未必了对修改关闭的原则。改动地方太多,耦合性增加,也不符合单一职责原则。

class Email2 {
    int e_type;
}
class QQ extends Email2{
    QQ(){
        super.e_type = 1;
    }
}

class Google extends Email2{
    Google(){
        super.e_type = 2;
    }
}

class SendEmail{
    public void print(Email2 e) {
        if(e.e_type == 1) send2();
        else send1();
    }
    public void send1() {
        System.out.println("Google发邮箱");
    }

    public void send2() {
        System.out.println("QQ发邮箱");
    }
}
public class OCPrinciple {
    public static void main(String[] args) {
        SendEmail sendEmail = new SendEmail();
        sendEmail.print(new QQ());
        sendEmail.print(new Google());
    }
}

改为符合开闭原则的代码

改进后的代码,只需要将Email改为一个抽象类,添加一个抽象方法send,添加一个SouHu类作为扩展即可。

abstract class Email2 {
    int e_type;
    public abstract void send();
}
class QQ extends Email2{
    QQ(){
        super.e_type = 1;
    }
    public void send() {
        System.out.println("QQ发邮箱");
    }
}

class Google extends Email2{
    Google(){
        super.e_type = 2;
    }
    public void send() {
        System.out.println("Google发邮箱");
    }
}

class SouHu extends Email2{
    SouHu() {
        super.e_type = 3;
    }
    public void send() {
        System.out.println("SouHu发邮箱");
    }
}

class SendEmail{
    public void print(Email2 e) {
        e.send();
    }
}
public class OCPrinciple {
    public static void main(String[] args) {
        SendEmail sendEmail = new SendEmail();
        sendEmail.print(new QQ());
        sendEmail.print(new Google());
        sendEmail.print(new SouHu());
    }
}

标签:原则,type,void,public,print,设计模式,Email2,class,开闭
来源: https://blog.csdn.net/xt199711/article/details/122191165

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有