zoukankan      html  css  js  c++  java
  • 面向对象程序设计之封装性、继承性、多态性

    面向控制台的计算器一

    package com.test.java.features1;
    
    import java.util.Scanner;
    
    /**
     * 计算器类
     */
    public class ComputingCounter {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入 stop 关闭计算器");
            while (true) {
                System.out.println("请输入一个数");
                String number = scanner.nextLine();
                if (number.equals("stop")) { break;}
                System.out.println("请输入一个运算符号");
                String symbol = scanner.nextLine();
                if (number.equals("stop")) { break;}
                System.out.println("请输入一个数");
                String number2 = scanner.nextLine();
                if (number.equals("stop")) { break;}
                compute(Double.parseDouble(number), Double.parseDouble(number2), symbol);
            }
            scanner.close();
        }
    
        private static void compute(double number, double number2, String symbol) {
            switch (symbol) {
                case "+":
                    System.out.println((number + number2));
                    break;
                case "-":
                    System.out.println((number - number2));
                    break;
                case "*":
                    System.out.println((number * number2));
                    break;
                case "/":
                    System.out.println((number / number2));
                    break;
            }
        }
    }
    View Code

    代码都写在了一个main方法里,这是面向过程编程。


    面向控制台的计算器二

    假如以后需求发生变化,需要写一个面向windows的计算器,计算器一的代码复用性不高;
    所以,我们把计算器一的代码封装为两部分——Client和Opration;Client只负责输入输出,Opration负责后台计算。
    这样,如果真的需求变化,要求写一个面向windows的计算器,Opration部分的代码完全是可以被复用的。

    package com.test.java.features2;
    
    import com.test.java.features2.Opration;
    
    import java.util.Scanner;
    
    public class Client {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入 stop 关闭计算器");
            while (true) {
                System.out.println("请输入一个数");
                String number = scanner.nextLine();
                if (number.equals("stop")) { break;}
                System.out.println("请输入一个运算符号");
                String symbol = scanner.nextLine();
                if (number.equals("stop")) { break;}
                System.out.println("请输入一个数");
                String number2 = scanner.nextLine();
                if (number.equals("stop")) { break;}
                Opration.compute(Double.parseDouble(number), Double.parseDouble(number2), symbol);
            }
            scanner.close();
        }
    }
    Client.java
    package com.test.java.features2;
    
    public class Opration {
        public static void compute(double number, double number2, String symbol) {
            switch (symbol) {
                case "+":
                    System.out.println((number + number2));
                    break;
                case "-":
                    System.out.println((number - number2));
                    break;
                case "*":
                    System.out.println((number * number2));
                    break;
                case "/":
                    System.out.println((number / number2));
            }
        }
    }
    Opration.java

    面向控制台的计算器三

    现在我们只支持加、减、乘、除,但是以后可能需要扩展其它的运算,比如x的y次方。
    所以把可能发生变化的部分再次封装,分别封装为加法类、减法类、乘法类、除法类,并让它们共同继承Opration类,也就是定义了一个算法族;并使用简单工厂模式创建具体的类而返回抽象类型(多态

    package com.test.java.features3;
    
    import java.util.Scanner;
    
    public class Client {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入 stop 关闭计算器");
            while (true) {
                System.out.println("请输入一个数");
                String number = scanner.nextLine();
                if (number.equals("stop")) { break;}
                System.out.println("请输入一个运算符号");
                String symbol = scanner.nextLine();
                if (number.equals("stop")) { break;}
                System.out.println("请输入一个数");
                String number2 = scanner.nextLine();
                if (number.equals("stop")) { break;}
                Opration.passOn(Double.parseDouble(number), Double.parseDouble(number2), symbol);
            }
            scanner.close();
        }
    }
    Client.java
    package com.test.java.features3;
    
    public abstract class Opration {
    
        public static void passOn(double number, double number2, String symbol) {
            Opration opratoin = OprationFactory.getOpratoin(symbol);
            opratoin.compute(number, number2);
        }
    
        public abstract void compute(double number, double number2);
    }
    Opration.java
    package com.test.java.features3;
    
    public class Add extends Opration {
        @Override
        public void compute(double number, double number2) {
            System.out.println((number + number2));
        }
    }
    Add.java
    package com.test.java.features3;
    
    public class Sub extends Opration{
        @Override
        public void compute(double number, double number2) {
            System.out.println((number - number2));
        }
    }
    Sub.java
    package com.test.java.features3;
    
    public class Multiply extends Opration {
        @Override
        public void compute(double number, double number2) {
            System.out.println((number * number2));
        }
    }
    Multiply.java
    package com.test.java.features3;
    
    public class Divide extends Opration {
        @Override
        public void compute(double number, double number2) {
            System.out.println((number / number2));
        }
    }
    Divide.java
    package com.test.java.features3;
    
    public class OprationFactory {
        public static Opration getOpratoin(String symbol) {
            switch (symbol) {
                case "+":
                    return new Add();
                case "-":
                    return new Sub();
                case "*":
                    return new Multiply();
                case "/":
                    return new Divide();
            }
            return null;
        }
    }
    OprationFactory.java

    总结:面向对象三大特征,封装性、继承性、多态性。有利于程序的复用性、可扩展性、维护性。

  • 相关阅读:
    2017 业余程序员的回顾
    而立将近,可有不惑
    谈谈转行
    吃干抹净提上裤子就甩
    Autosizer应用程序窗口控制工具
    AutoCAD2007专业版
    Revit中如何添加水平仰视平面视图
    Revit中绘制带坡度管道
    Revit自定义快递访问工具栏
    Revit利用对正工具快速修改风管对齐方式
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10137860.html
Copyright © 2011-2022 走看看