首页 > 编程语言 >Java设计原则

Java设计原则

时间:2023-02-06 12:02:11浏览次数:47  
标签:Java 原则 display void AbstractSkin skin 设计 父类 public

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。

一、 开闭原则


对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。

想要达到这样的效果,我们需要使用接口和抽象类。

因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

【例】搜狗输入法 的皮肤设计。

抽象皮肤类(AbstractSkin):

public abstract class AbstractSkin {
    //显示方法
    public abstract void display();
}

默认皮肤(DefaultSkin):

public class DefaultSkin extends AbstractSkin {
    /**
     *
     */
    @Override
    public void display() {
        System.out.println("默认皮肤");
    }
}

自定义皮肤皮肤(CustSkin):

public class CustSkin extends AbstractSkin {
    /**
     *
     */
    @Override
    public void display() {
        System.out.println("黑马皮肤");
    }
}

搜狗输入法(SouGouInput):

public class SouGouInput {
    private AbstractSkin skin;

    public void setSkin(AbstractSkin skin) {
        this.skin = skin;
    }

    public void display() {
        skin.display();
    }
}

测试:

public class TestSkin {
    public static void main(String[] args) {
        //使用皮肤
        SouGouInput souGouInput=new SouGouInput();
        //用户选择皮肤
        DefaultSkin defaultSkin=new DefaultSkin();
        CustSkin custSkin =new CustSkin();
        //调用
        souGouInput.setSkin(defaultSkin);
        //显示
        souGouInput.display();
    }
}

二、里氏代换原则


里氏代换原则是面向对象设计的基本原则之一。

里氏代换原则:任何基类可以出现的地方,子类一定可以出现。通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

如果通过重写父类的方法来完成新的功能,这样写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大。

下面看一个里氏替换原则中经典的一个例子

【例】正方形不是长方形。

我们发现,假如我们把一个普通长方形作为参数传入resize方法,就会看到长方形宽度逐渐增长的效果,当宽度大于长度,代码就会停止,这种行为的结果符合我们的预期;假如我们再把一个正方形作为参数传入resize方法后,就会看到正方形的宽度和长度都在不断增长,代码会一直运行下去,直至系统产生溢出错误。所以,普通的长方形是适合这段代码的,正方形不适合。
我们得出结论:在resize方法中,Rectangle类型的参数是不能被Square类型的参数所代替,如果进行了替换就得不到预期结果。因此,Square类和Rectangle类之间的继承关系违反了里氏代换原则,它们之间的继承关系不成立,正方形不是长方形。

如何改进呢?此时我们需要重新设计他们之间的关系。抽象出来一个四边形接口(Quadrila

标签:Java,原则,display,void,AbstractSkin,skin,设计,父类,public
From: https://www.cnblogs.com/ynxiyan/p/17094948.html

相关文章

  • 7.6提供相同运行环境的Java虚拟机
    除虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。大家说的Java,有两个层面的意思。一个是作为编程语言的Java,另一个是作为程......
  • 工作流组件设计介绍
    大家好,我是陶朱公Boy(一个认真生活总想超越自己的程序员!)。前言前段时间因业务需要完成了一个工作流组件的编码工作。借着这个机会跟大家分享一下整个创作过程,希望大家......
  • 使用Openfeign,出现: java.lang.NoClassDefFoundError: org/apache/http/ssl/SSLContext
    之前是好的,后来项目启动,莫名其妙出现这个问题。猜测肯定是包的版本问题。 升级了cloudalibaba和boot-dependencies,发现还是没用。后面查找文章,说是这个版本低了。......
  • JavaScript中和动画相关的几个事件
    JavaScript中有以下几种与动画相关的事件:requestAnimationFrame这个事件可以在浏览器重绘之前触发,通常用于制作高性能动画。下面是一个使用requestAnimationFrame来制作简......
  • 7.6提供相同运行环境的Java虚拟机
    除虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。大家说的Java,有两个层面的意思。一个是作为编程语言的Java,另一个是作为程......
  • 面向对象五大原则
    一、单一功能原则(SingleResponsibilityPrinciple) 一个类都应该有一个单一的功能,不为其实现过多的功能点 二、开闭原则(OpenClosedPrinciple) 软件中的对......
  • 如何轻松完成BOM\工艺\设计的版本管理,利用JVS的协同设计直接省下几十万的PLM费用
    对于智能制造企业的对于研发、设计部门而言,对产品数据的管理非常重要,但是往往一个PLM或者PDM系统往往要好几十万,这个对于一些中小型的制造企业来讲压力非常大。 特别是非......
  • JavaScript 数组常用方法大全
    前言大家好,我是CoderBin,本次总结了JavaScript中关于数组的一些常用操作,想学习其他方法或者深入学习这些方法的可点击前往MDN-Array。希望对大家有所帮助,谢谢!如果文中有不......
  • 面向对象程序设计 第八章 多态性
    目录运行时的多态性(虚函数、纯虚函数、抽象类)  override与final  重载运算符(运算符重载为成员函数)  运算符重载为非成员函数 ......
  • 搞懂设计模式——代理模式 + 原理分析
    作者:京东零售秦浩然引子举个栗子,众所周知,我们是可以在京东上购买机票的。但机票是航司提供的,我们本质上是代理销售而已。那为什么航司要让我们代理销售呢?我们又是如......