zoukankan      html  css  js  c++  java
  • 典型重构6 (多态)

    用多态替换条件
      3中交通工具

    public class Car : Vehicle
    {
        public int AmountOfFuelNeededToFillTank()
        {
            return 12;
        }
    }
    public class Airplane : Vehicle
    {
        public int AmountOfFuelNeededToFillLeftFuelTank()
        {
            return 3;
        }
        public int AmountOfFuelNeededToFillRightFuelTank()
        {
            return 4;
        }
    }
    public class Boat : Vehicle
    {
        public int AmountOfFuelNeededToFillFrontFuelTank()
        {
            return 8;
        }
        public int AmountOfFuelNeededToFillRearFuelTank()
        {
            return 10;
        }
    }

    检查加油车路线上所有车辆以确定要在该加油车内装多少燃料

    public class FuelingStation
    {
        public int AddFuelToTruck(List<Vehicle> vehiclesOnRoute)
        {
            var amountOfFuelToLoadOnTruck=0;
            foreach(var vehicle in vehiclesOnRoute)
            {
                if(vehicle is Car)
                {
                    amountOfFuelToLoadOnTruck+=((Car)vehicle).AmountOfFuelNeededToFillTank();
                }
                else if(vehicle is Airplane)
                {
                    amountOfFuelToLoadOnTruck+=((Airplane)vehicle).AmountOfFuelNeededToFillLeftFuelTank();
                    amountOfFuelToLoadOnTruck+=((Airplane)vehicle).AmountOfFuelNeededToFillRightFuelTank();
                }
                else if(vehicle is Boat)
                {
                    amountOfFuelToLoadOnTruck+=((Boat)vehicle).AmountOfFuelNeededToFillFrontFuelTank();
                    amountOfFuelToLoadOnTruck+=((Boat)vehicle).AmountOfFuelNeededToFillRearFuelTank();
                }
            }
            return amountOfFuelToLoadOnTruck;
        }
    }

    使用动态性对这一方法进行重构,一避免用到交通工具类型的隐秘信息

    public interface IFuelable
    {
        int GetTotalAmountOfFuelNeededForVehicle();
    }

    针对Vehicle类实现该接口

    public class Car : Vehicle,IFuelable
    {
        public int GetTotalAmountOfFuelNeededForVehicle()
        {
            return AmountOfFuelNeededToFillTank();
        }
    }
    public class Airplane : Vehicle,IFuelable
    {
        public int GetTotalAmountOfFuelNeededForVehicle()
        {
            return AmountOfFuelNeededToFillLeftFuelTank()+AmountOfFuelNeededToFillRightFuelTank();
        }
    }
    public class Boat : Vehicle,IFuelable
    {
        public int GetTotalAmountOfFuelNeededForVehicle()
        {
    
            return AmountOfFuelNeededToFillFrontFuelTank()+AmountOfFuelNeededToFillRearFuelTank();
        }
    }

    重构结果:

    public class FuelingStation
    {
        public int AddFuelToTruck(List<Vehicle> vehiclesOnRoute)
        {
            var amountOfFuelToLoadOnTruck=0;
            foreach(var vehicle in vehiclesOnRoute)
            {
                amountOfFuelToLoadOnTruck+=vehicle.GetTotalAmountOfFuelNeededForVehicle();
            }
            return amountOfFuelToLoadOnTruck;
        }
    }

    或者利用LINQ功能

    public int AddFuelToTruck(List<Vehicle> vehiclesOnRoute)
        {
            return vehiclesOnRoute.Sum(vehicle=>vehicle.GetTotalAmountOfFuelNeededForVehicle());
        }
  • 相关阅读:
    ThinkPHP---thinkphp视图(V)
    PHP封装文件上传
    小数据池、深浅拷贝、集合
    字典、字典嵌套
    列表、元组、range
    字符串详解:整型、可变数据类型和不可变数据类型、进制转换、索引、切片、步长、字符串方法、进制转换
    while循环、break、格式化、运算符、编码初始
    强烈推荐一款CSS导航菜单
    解决WEB页面上"焦点控制"一法
    新闻发布项目——后台JSP界面adminManage/manageTopic.jsp
  • 原文地址:https://www.cnblogs.com/Evelia/p/3494284.html
Copyright © 2011-2022 走看看