zoukankan      html  css  js  c++  java
  • java.两个例子充分阐述多态的可拓展性

      下面我将以两个例子来充分阐述java中多态的可拓展性,作为一名优秀的程序员,就必须了解程序的可拓展性,非常利于程序后续的开发。

          第一个例子:利用电脑的主板来作为例子,就我们所熟悉的电脑的主板,里面是不是有很多模块,网卡,声卡,想要用到这些功能,只能当主板运行起来,再给网卡和声卡供电就可以,但这用软件语言怎么来实现呢?是不是先要主板跑起来,主板再让声卡或者网卡跑起来,但这样做,拓展性不高让声卡和网卡跑起来的操作是重复的,而且有很多模块也具备这样的功能,就单纯让主板上的模块跑起来,这是其一,万一,那一天,技术更新,新的模块出现了,是不是又要创建模块的对象,然后又跑起来,这显然是不利于开发的,但是针对这一个问题,主板的厂商和声卡,网卡的厂商商量后,以后就用一个PCI接口来连接主板和模块,彻底解决了更新不能用或者重复使用的问题,而这恰恰对应了我们的java中的多态,利用多态,我们能大大提高程序的可拓展性!具体代码如下!

        /*
    需求:
    电脑运行实例,
    电脑运行基于主板。
    */


    interface PCI
    {
        public void open();
        public void close();
    }

    class MainBoard
    {
        public void run()
        {
            System.out.println("mainboard run ");
        }
        public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。
        {
            if(p!=null)
            {
                p.open();
                p.close();
                
            }
        }
    }


    class NetCard implements PCI
    {
        public void open()
        {
            System.out.println("netcard open");
        }
        public void close()
        {
            System.out.println("netcard close");
            method();
        }
        
    }
    class SoundCard implements PCI
    {
        public void open()
        {
            System.out.println("SoundCard open");
        }
        public void close()
        {
            System.out.println("SoundCard close");
        }
    }
    /*
    class MainBoard
    {
        public void run()
        {
            System.out.println("mainboard run");
        }
        public void useNetCard(NetCard c)
        {
            c.open();
            c.close();
        }
    }

    class NetCard
    {
        public void open()
        {
            System.out.println("netcard open");
        }
        public void close()
        {
            System.out.println("netcard close");
        }
    }
    */

    class DuoTaiDemo5
    {
        public static void main(String[] args)
        {
            MainBoard mb = new MainBoard();
            mb.run();
            mb.usePCI(null);
            mb.usePCI(new NetCard());
            mb.usePCI(new SoundCard());
            
        }
    }
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      第二个例子:利用常用数据库来解释多态,就我们熟知的数据库而言,目前有两种数据库的连接模式:JDBC和Hibernatelian连接,使用数据库,都有两个必不可少的操作,连接和关闭,这时候,使用接口,把这两种操作封装起来,需要使用那种连接模式直接更换类名就可以了!具体代码如下!

    /*
    需求:数据库的操作。
    数据是:用户信息。
    1,连接数据库。JDBC  Hibernate
    2,操作数据库。
        c create r read  u update  d delete
    3,关闭数据库连接。
    */

    interface UserInfoDao
    {
        public void add(User user);

        public void delete(User user);
    }

    class UserInfoByJDBC implements UserInofDao
    {

        public void add(User user)
        {
            1,JDBC连接数据库。;
            2,使用sql添加语句添加数据。;
            3,关闭连接。
        }
        public void delete(User user)
        {
            1,JDBC连接数据库。;
            2,使用sql添加语句删除数据。;
            3,关闭连接。
        }
    }

    class UserInfoByHibernate implements UserInfoDao
    {
        public void add(User user)
        {
            1,Hibernate连接数据库。;
            2,使用sql添加语句添加数据。;
            3,关闭连接。
        }
        public void delete(User user)
        {
            1,Hibernate连接数据库。;
            2,使用sql添加语句删除数据。;
            3,关闭连接。
        }
    }

    class  DBOperate
    {
        public static void main(String[] args)
        {
            //UserInfoByJDBC ui = new UserInfoByJDBC();
    //        UserInfoByHibernate ui = new UserInfoByHibernate();
            UserInfoDao ui = new UserInfoByHibernate();
            ui.add(user);
            ui.delete(user);
        }
    }
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



    总结:

    1.这两个例子都使用了接口来抽象出一些重复的操作,为了让不同的模块能直接快捷地使用这些操作,直接使用多态的向上转型(看我之前的博客),能后用父类引用去调用,反正之后无论是技术更新而有了新的模块或者更换已有模块,我们都可以使用父类的引用去直接调用它们共同的操作!



    2.不一定用接口,也可以使用抽象类,但是,使用接口,可拓展性更高,以后有更新,可以直接改动接口,不用去改动抽象类,其次,使用接口,能够被多继承!这也是方便的地方。

  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/liangqiyuan/p/5572672.html
Copyright © 2011-2022 走看看