zoukankan      html  css  js  c++  java
  • java 反射模式

    反射模式优化工厂类大量switch分支问题

    继续上一篇工厂模式的案例,上一篇只有两个算法类(加法和减法),现在再加一个乘法

    第一步:

    //运算类
    public class Operation {
        
        private double _numberA=0;
        private double _numberB=0;
        public double get_numberA() {
            return _numberA;
        }
        public void set_numberA(double _numberA) {
            this._numberA = _numberA;
        }
        public double get_numberB() {
            return _numberB;
        }
        public void set_numberB(double _numberB) {
            this._numberB = _numberB;
        }
        
        /**
         *得到运算结果 
         * @author ys-developer 
         * @return 
         * @since JDK 1.6
         */
        public double getResult(){
            double result=0;
            return result;
        }
    
    }

    第二步:

    //加法类
    public class OperationAdd extends Operation{
         @Override
         public  double getResult(){
             double result=0;
             result=get_numberA()+get_numberB();
             return result;
         }
    }
    //减法类
    public class OperationSub extends Operation {
    
        @Override
        public double getResult(){
            double result=0.0;
            result=get_numberA()-get_numberB();
            return result;
        }
    }
    //乘法类
    public class OperationRide extends Operation {
    
        @Override
        public double getResult(){
            double result=0.0;
            result=get_numberA()*get_numberB();
            return result;
        }
    }

    第三步:

    创建一个properties配置文件,将“加减乘”类变成简单配置

    JIA=OperationAdd
    JIAN=OperationSub
    CHENG=OperationRide

    第四步:

    修改工厂类  

    //反射工厂
    public class ReflexFactor {
    
        public static Operaction choose(String shortName){
            Operation operation=null;
            //从properties文件中读取shortName对应的完整包名
            Properties pro=new Properties();
            try {
                pro.load(new FileInputStream("src/Calculator.properties"));
                String fullName=pro.getProperty(shortName);
                
                //相当于代替工厂模式,直接将需要new的类写进去即可
                operation=(Operation) Class.forName(fullName).newInstance();//注意:如果找不到对应类,那么就得加上前面的路径  Class.forName("src."+fullName).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return operation;
        }
    }

    最后测试:

    public class Test {
    
        public static void main(String[] args) {
            Operation oper=new Operation();
            Scanner scan = new Scanner(System.in);
            boolean isok=true;
            while (isok) {
                System.out.println("请输入数字A:");
                double a=scan.nextInt();
                System.out.println("请输入运算符号(+、-、*、/):");
                String b=scan.next();
                System.out.println("请输入数字B");
                double c=scan.nextInt();
                
                oper=ReflexFactor.choose(b);
                oper.set_numberA(a);
                oper.set_numberB(c);
                System.out.println("结果等于:"+oper.getResult());
                System.out.println("是否继续(y/n)");
                String d=scan.next();
                if (d.equals("n")) {
                    break;
                }
            }
            
            
        }
    }

    总结:修改后的工厂类,大大的减少了switch 判断,以后在加一个除法,只需要创建要给除法类,在配置文件加一个配置即可,不需要再修改工程类

  • 相关阅读:
    noip2010 乌龟棋
    noip2010 机器翻译
    noip2009 靶形数独
    noip2009 最优贸易
    noip2009 Hankson的趣味题
    noip2009 潜伏者
    noi2010 能量采集
    八大排序算法(六) 快速排序
    八大排序算法(六) 快速排序
    Lesson 12 Nehe
  • 原文地址:https://www.cnblogs.com/fxd980519/p/9372320.html
Copyright © 2011-2022 走看看