从“把大象装进冰箱”来谈谈面向对象程序设计

引子

从“把大象装进冰箱”来谈谈面向对象程序设计

把大象装进冰箱需要3步:打开冰箱门,把大象装入冰箱,关闭冰箱门。

扩展一下,我们考虑把动物装进冰箱的场景。比如,把猪🐷装进冰箱,把狗🐶装进冰箱,等等。

怎么利用面向对象的思想来进行程序设计呢?

talk is cheap, show me the code.

把大象装进冰箱的程序设计及实现

把大象装进冰箱,这个比较简单,简单到只有某些初级程序员写不出来。

如下,估计都是这个玩法。

从“把大象装进冰箱”来谈谈面向对象程序设计

代码就不贴了。

把动物装进冰箱的程序设计及实现

推而广之,要把不同的动物装进冰箱,并且假定每种动物装进冰箱的方式不同。那么,该怎么进行程序设计来实现这个需求呢?

程序结构图

从“把大象装进冰箱”来谈谈面向对象程序设计

类结构图

从“把大象装进冰箱”来谈谈面向对象程序设计

model-模型类

Animal是抽象类(你可以new一头大象,一条狗,但你总不能new一个动物吧):

package com.animal2icebox.model;

import lombok.Data;

@Data
public abstract class Animal {
    String name;
}

大象模型类-Elephant:

package com.animal2icebox.model;

import lombok.Data;

@Data
public class Elephant extends Animal {
    int weight;

}

狗狗模型类-Dog:

package com.animal2icebox.model;

import lombok.Data;

@Data
public class Dog extends Animal {
    /**
     * 狗狗品种
     */
    String breed;

}

重点是把动物装进冰箱的服务类

AnimalIntoIceboxService是抽象基类,提供了把动物装进冰箱的门面方法。但是由于每一种动物装入冰箱的方式各不相同,所以,要暴露接口(抽象方法)给派生类来实现。

package com.animal2icebox.service;

import com.animal2icebox.model.Animal;

public abstract class AnimalIntoIceboxService {
    IceboxService iceboxService=new IceboxService();

    public void putIntoIcebox(Animal animal) {
        System.out.println("=============================");
        iceboxService.openTheDoor();
        input(animal);
        iceboxService.closeTheDoor();
    }

    protected abstract void input(Animal animal);
}

把大象装进冰箱-ElephantIntoIceboxService:

从“把大象装进冰箱”来谈谈面向对象程序设计从“把大象装进冰箱”来谈谈面向对象程序设计
package com.animal2icebox.service;

import com.animal2icebox.model.Animal;
import com.animal2icebox.model.Elephant;

public class ElephantIntoIceboxService extends AnimalIntoIceboxService {
    @Override
    protected void input(Animal animal) {
        Elephant elephant = (Elephant) animal;
        System.out.println(String.format("大象信息:name=%s,重量=%s吨", elephant.getName(), elephant.getWeight()));
        int threshold = 5;
        int i = 0;
        for (i = threshold; i  threshold) {
            System.out.println(String.format("这头大象重%s吨,已放入%s吨", elephant.getWeight(), threshold));
        }
        i -= threshold;
        if (elephant.getWeight() > i) {
            System.out.println(String.format("这头大象重%s吨,已放入%s吨", elephant.getWeight(), elephant.getWeight() - i));
        }
        System.out.println("已成功把大象装进冰箱!");
    }

}

View Code

把狗狗装进冰箱-DogIntoIceboxService:

从“把大象装进冰箱”来谈谈面向对象程序设计从“把大象装进冰箱”来谈谈面向对象程序设计
package com.animal2icebox.service;

import com.animal2icebox.model.Animal;
import com.animal2icebox.model.Dog;

public class DogIntoIceboxService extends AnimalIntoIceboxService {
    @Override
    protected void input(Animal animal) {
        System.out.println("撒狗粮 here");
        Dog dog=(Dog)animal;
        String words = String.format("%s(品种=%s)", dog.getName(), dog.getBreed());
        System.out.println("Hi " + words + ", welcome into the icebox...");
    }
}

View Code

AnimalIntoIceboxFactory-工厂-生产的产品是上面的装进冰箱的动物service类对象

package com.animal2icebox.factory;

import com.animal2icebox.model.Animal;
import com.animal2icebox.model.Dog;
import com.animal2icebox.model.Elephant;
import com.animal2icebox.service.AnimalIntoIceboxService;
import com.animal2icebox.service.DogIntoIceboxService;
import com.animal2icebox.service.ElephantIntoIceboxService;
import lombok.Getter;

public class AnimalIntoIceboxFactory {
    public static AnimalIntoIceboxService getServiceInstance(Animal animal) {
        Class serviceClass = AnimalIntoBoxEnum.getServiceClass(animal);
        assert serviceClass != null;

        try {
            return serviceClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Getter
    enum AnimalIntoBoxEnum {
        Elephants(Elephant.class, ElephantIntoIceboxService.class),
        Dogs(Dog.class, DogIntoIceboxService.class),
        ;

        Class animalClass;
        Class serviceClass;

        extends Animal, S extends AnimalIntoIceboxService> AnimalIntoBoxEnum(Class animalClass, Class serviceType) {
            this.animalClass = (Class) animalClass;
            this.serviceClass = (Class) serviceType;
        }

        public static Class getServiceClass(Animal animal) {
            AnimalIntoBoxEnum[] values = AnimalIntoBoxEnum.values();
            for (AnimalIntoBoxEnum anEnum : values) {
                if (anEnum.animalClass.equals(animal.getClass())) {
                    return anEnum.getServiceClass();
                }
            }
            return null;
        }
    }
}

AnimalIntoIceboxContext-上下文容器,供外部调用

package com.animal2icebox.context;

import com.animal2icebox.factory.AnimalIntoIceboxFactory;
import com.animal2icebox.model.Animal;
import com.animal2icebox.model.Dog;
import com.animal2icebox.model.Elephant;
import com.animal2icebox.service.AnimalIntoIceboxService;

import java.util.ArrayList;
import java.util.List;

public class AnimalIntoIceboxContext {

    public void putAnimalIntoIcebox(List animals) {
        for (Animal animal : animals) {
            AnimalIntoIceboxService elephantIntoIceboxService = AnimalIntoIceboxFactory.getServiceInstance(animal);
            assert elephantIntoIceboxService != null;
            elephantIntoIceboxService.putIntoIcebox(animal);
        }
    }
}

来吧,开启调用之旅

package com.animal2icebox;

import com.animal2icebox.context.AnimalIntoIceboxContext;
import com.animal2icebox.model.Animal;
import com.animal2icebox.model.Dog;
import com.animal2icebox.model.Elephant;

import java.util.ArrayList;
import java.util.List;

public class AnimalIntoIceboxTest {
    public static void main(String[] args) {
        List animals = new ArrayList<>();

        Elephant elephant1 = new Elephant();
        elephant1.setName("Emily");
        elephant1.setWeight(13);
        animals.add(elephant1);

        Dog dog = new Dog();
        dog.setName("Lucky");
        dog.setBreed("dhole");
        animals.add(dog);

        Elephant elephant2 = new Elephant();
        elephant2.setName("包包大人");
        elephant2.setWeight(2);
        animals.add(elephant2);

        AnimalIntoIceboxContext context=new AnimalIntoIceboxContext();
        context.putAnimalIntoIcebox(animals);
    }
}

程序运行结果:

=============================
the door is open.

大象信息:name=Emily,重量=13吨
这头大象重13吨,已放入5吨
这头大象重13吨,已放入5吨
这头大象重13吨,已放入3吨
已成功把大象装进冰箱!
the door is closed.

=============================
the door is open.

撒狗粮 here
Hi Lucky(品种=dhole), welcome into the icebox...

the door is closed.

=============================
the door is open.

大象信息:name=包包大人,重量=2吨
这头大象重2吨,已放入2吨
已成功把大象装进冰箱!
the door is closed.

so,本文在”把动物装进冰箱”这个需求场景里,使用了哪些设计模式或设计思想呢?

Original: https://www.cnblogs.com/buguge/p/16366630.html
Author: buguge
Title: 从“把大象装进冰箱”来谈谈面向对象程序设计

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/591628/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 并发编程学习

    Semaphore Semaphore 可以允许多个线程访问一个临界区。 应用:实现线程池 CountDownLatch 应用: 业务原始状态:一个线程执行查询订单,查询派送单,对…

    数据库 2023年6月16日
    0126
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库【按照数据结构来组织、存储和管理数据的仓库】。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据对于公司来说最宝贵的财…

    数据库 2023年6月14日
    0123
  • [Mysql]Ubuntu如何安装Mysql+启用远程连接[完整版]

    唉。下面是我花了不知道多少个小时踩过的所有坑总结出来的血泪史,希望能帮你们少踩一些坑吧,正常来讲一步一步下来就不会出现任何问题了。 背景 用的是百度云的云服务器(其他云服务器同理)…

    数据库 2023年6月16日
    0116
  • MyBatis(二)-CURD (ResultMap 一对一,一对多)

    1、insert 标签 1.1 获取SqlSessionFactory 对象的通用方法 方便后面分测试; //获取SqlSessionFactory 对象的通用方法 public …

    数据库 2023年6月16日
    0122
  • Spring源码分析-BeanFactoryPostProcessor

    Spring源码分析-BeanFactoryPostProcessor 博主技术有限,本文难免有错误的地方,如果您发现了欢迎评论私信指出,谢谢JAVA技术交流群:737698533…

    数据库 2023年6月16日
    0135
  • COM组件 学习笔记

    COM组件是 以Win32动态链接库dll或可执行文件exe的形式发布的可执行代码组成的; COM组件是动态链接的,COM使用dll将组件动态链接起来; COM组件是语言无关的; …

    数据库 2023年6月14日
    0116
  • 最新Spring Boot 跨域配置,亲测好用

    背景: 网上有很多跨域配置,但都存在各种各样问题;经过改良和测试后,最终形成一个稳定配置版本,我的Spring Boot版本是2.5.1 问题: 前后端分离后,进行联调,发现浏览器…

    数据库 2023年6月6日
    0145
  • 猿创征文|小而巧的API文档生成工具之smart-doc

    文章目录 smart-doc介绍 smart-doc特性 smart-doc的最佳搭档 谁在使用smart-doc smart-doc的优缺点 smart-doc和swagger区…

    数据库 2023年6月6日
    0299
  • 如何基于LSM-tree架构实现一写多读

    PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、海量存储、高性能、低成本的数据库服务。X-Engine…

    数据库 2023年5月24日
    0114
  • Dubbo源码(三)-服务导出(生产者)

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 在了解了Dubbo SPI后,我们来了解下Dubbo服务导出的过程。 Dub…

    数据库 2023年6月11日
    0114
  • 多商户商城系统功能拆解21讲-平台端分销订单

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    0144
  • 多商户商城系统功能拆解22讲-平台端分销商品

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    0128
  • MySQL 笔记

    情景一数据库概述基本术语DB : 数据库 ( Database )它是根据数据结构组织、存储和管理数据的仓库。它被视为电子档案柜,用户可以对文件中的数据进行添加、删除、修改、查找等…

    数据库 2023年5月24日
    0122
  • 数据库的主从搭建

    数据库(mariadb)主从搭建 1,准备两台虚拟机(本文使用centos7演示)! 一:启动虚拟机配置环境安装数据库(俩节点都要执行操作) setenforce 0 Origin…

    数据库 2023年6月16日
    0180
  • CentOS7.2解决vsftpd启动失败,code=exited,status=2问题的几个方法参考

    【问题说明】重启vsftpd服务失败:[root@data ~]# systemctl restart vsftpdJob for vsftpd.service failed. S…

    数据库 2023年6月14日
    0382
  • 读取resources下的资源

    这里我通过一个普通的SpringBoot项目进行测试,当然其他项目也都是通用的。 将其中的Test修改为你的类名即可: java;gutter:true; import lombo…

    数据库 2023年6月14日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球