JAVA实现有理数的运算+JAVA中的适配器模式

水深无声 2022-07-28 10:53 173阅读 0赞

题目要求:

设计一个抽象类,声明有关算术运算的方法,并创建四个(或者一个)子类继承该抽象的类,完成进行加、减、乘、除四则运算。

整个题目总共经过了三轮完善,第一发没有利用抽象类,只是简单的实现了基本操作;第二枚用了四个子类去继承这个原有的抽象类,其中就用到了可以骗人的适配器模式,没有实现方法的重写,而是用的方法的重载;第三弹则是用一个子类去继承该抽象类,并重写了其中的抽象方法完成了运算。建议大家直接看第三种!

JAVA中的适配器模式:在学习抽象类的继承和接口的实现时,我们总是要全部重写其中的抽象方法,能不能不这么烦呢,有一种适配器模式,可以巧妙的使用,来达到这个目的。

  1. Aa.java
  2. package cn.nefu.edu.zhihu;
  3. public interface Aa {
  4. void a();
  5. void b();
  6. }
  7. Ab.java
  8. package cn.nefu.edu.zhihu;
  9. public class Ab implements Aa{
  10. public void a() {
  11. // TODO Auto-generated method stub
  12. }
  13. public void b() {
  14. // TODO Auto-generated method stub
  15. }
  16. }
  17. Ac.java
  18. package cn.nefu.edu.zhihu;
  19. public class Ac extends Ab{
  20. }

方法一代码:

  1. Youlishu.java
  2. package cn.nefu.edu.zhihu;
  3. public class Youlishu {
  4. int fenzi,fenmu;
  5. Youlishu(){
  6. }
  7. Youlishu(int fenzi,int fenmu){
  8. this.fenzi=fenzi;
  9. this.fenmu=fenmu;
  10. }
  11. int gcd(int x,int y){
  12. if(y==0)
  13. return x;
  14. else
  15. return gcd(y,x%y);
  16. }
  17. int lcm(int x,int y){
  18. return x*y/gcd(x,y);
  19. }
  20. Youlishu add(Youlishu a,Youlishu b){
  21. Youlishu c=new Youlishu(0,0);
  22. int d1,d2;
  23. int lcmm=lcm(a.fenmu,b.fenmu);
  24. c.fenmu=lcmm;
  25. d1=lcmm/a.fenmu;
  26. d2=lcmm/b.fenmu;
  27. c.fenzi=d1*a.fenzi+d2*b.fenzi;
  28. int d=gcd(c.fenzi,c.fenmu);
  29. c.fenzi=c.fenzi/d;
  30. c.fenmu=c.fenmu/d;
  31. return c;
  32. }
  33. Youlishu sub(Youlishu a,Youlishu b){
  34. Youlishu c=new Youlishu(0,0);
  35. int d1,d2;
  36. int lcmm=lcm(a.fenmu,b.fenmu);
  37. c.fenmu=lcmm;
  38. d1=lcmm/a.fenmu;
  39. d2=lcmm/b.fenmu;
  40. c.fenzi=d1*a.fenzi-d2*b.fenzi;
  41. int d=gcd(c.fenzi,c.fenmu);
  42. c.fenzi=c.fenzi/d;
  43. c.fenmu=c.fenmu/d;
  44. return c;
  45. }
  46. Youlishu cheng(Youlishu a,Youlishu b){
  47. Youlishu c=new Youlishu(0,0);
  48. c.fenzi=a.fenzi*b.fenzi;
  49. c.fenmu=a.fenmu*b.fenmu;
  50. int d=gcd(c.fenzi,c.fenmu);
  51. c.fenzi=c.fenzi/d;
  52. c.fenmu=c.fenmu/d;
  53. return c;
  54. }
  55. Youlishu chu(Youlishu a,Youlishu b){
  56. Youlishu c=new Youlishu(0,0);
  57. c.fenzi=a.fenzi*b.fenmu;
  58. c.fenmu=a.fenmu*b.fenzi;
  59. int d=gcd(c.fenzi,c.fenmu);
  60. c.fenzi=c.fenzi/d;
  61. c.fenmu=c.fenmu/d;
  62. return c;
  63. }
  64. //getxiaoshu()
  65. void show(){
  66. System.out.println(fenzi+"/"+fenmu);
  67. }
  68. }
  69. Test1.java
  70. package cn.nefu.edu.zhihu;
  71. import java.util.Scanner;
  72. public class test1 {
  73. public static void main(String[] args) {
  74. Youlishu a=new Youlishu(2,3);
  75. Youlishu b=new Youlishu(3,2);
  76. Youlishu c=new Youlishu(0,0);
  77. c=c.add(a,b);
  78. c.show();
  79. c=c.sub(a,b);
  80. c.show();
  81. c=c.cheng(a,b);
  82. c.show();
  83. c=c.chu(a,b);
  84. c.show();
  85. System.out.println("Please Input Youlishu a and b:");
  86. Scanner reader=new Scanner(System.in);
  87. a.fenzi=reader.nextInt();
  88. a.fenmu=reader.nextInt();
  89. b.fenzi=reader.nextInt();
  90. b.fenmu=reader.nextInt();
  91. c=c.add(a,b);
  92. c.show();
  93. c=c.sub(a,b);
  94. c.show();
  95. c=c.cheng(a,b);
  96. c.show();
  97. c=c.chu(a,b);
  98. c.show();
  99. }
  100. }

方法二代码:

  1. Yunsuan.java
  2. package cn.edu.nefu.zhihu;
  3. public abstract class Yunsuan {
  4. int gcd(int a,int b){
  5. if(b==0)
  6. return a;
  7. else
  8. return gcd(b,a%b);
  9. }
  10. int lcm(int a,int b){
  11. return a*b/gcd(a,b);
  12. }
  13. abstract Object add(Object a,Object b);
  14. abstract Object sub(Object a,Object b);
  15. abstract Object multi(Object a,Object b);
  16. abstract Object divid(Object a,Object b);
  17. }
  18. Yunsuanzi.java
  19. package cn.edu.nefu.zhihu; //适配器模式
  20. public class Yunsuanzi extends Yunsuan{
  21. @Override
  22. Object add(Object a, Object b) {
  23. // TODO Auto-generated method stub
  24. return null;
  25. }
  26. @Override
  27. Object divid(Object a, Object b) {
  28. // TODO Auto-generated method stub
  29. return null;
  30. }
  31. @Override
  32. Object multi(Object a, Object b) {
  33. // TODO Auto-generated method stub
  34. return null;
  35. }
  36. @Override
  37. Object sub(Object a, Object b) {
  38. // TODO Auto-generated method stub
  39. return null;
  40. }
  41. }
  42. Add.java
  43. package cn.edu.nefu.zhihu;
  44. public class Add extends Yunsuanzi {
  45. Object add(Youlishu a,Youlishu b){
  46. Youlishu c = new Youlishu(0,0);
  47. int d1,d2;
  48. int lcmm=lcm(a.fenmu,b.fenmu);
  49. c.fenmu=lcmm;
  50. d1=lcmm/a.fenmu;
  51. d2=lcmm/b.fenmu;
  52. c.fenzi=d1*a.fenzi+d2*b.fenzi;
  53. int d=gcd(c.fenzi,c.fenmu);
  54. c.fenzi=c.fenzi/d;
  55. c.fenmu=c.fenmu/d;
  56. return c;
  57. }
  58. }
  59. Sub.java
  60. package cn.edu.nefu.zhihu;
  61. public class Sub extends Yunsuanzi{
  62. Object sub(Youlishu a,Youlishu b){ //注意:方法的重载,不是重写
  63. Youlishu c=new Youlishu(0,0);
  64. int d1,d2;
  65. int lcmm=lcm(a.fenmu,b.fenmu);
  66. c.fenmu=lcmm;
  67. d1=lcmm/a.fenmu;
  68. d2=lcmm/b.fenmu;
  69. c.fenzi=d1*a.fenzi-d2*b.fenzi;
  70. int d=gcd(c.fenzi,c.fenmu);
  71. c.fenzi=c.fenzi/d;
  72. c.fenmu=c.fenmu/d;
  73. return c;
  74. }
  75. }
  76. Multi.java
  77. package cn.edu.nefu.zhihu;
  78. public class Multi extends Yunsuanzi {
  79. Object multi(Youlishu a,Youlishu b){
  80. Youlishu c=new Youlishu(0,0);
  81. c.fenzi=a.fenzi*b.fenzi;
  82. c.fenmu=a.fenmu*b.fenmu;
  83. int d=gcd(c.fenzi,c.fenmu);
  84. c.fenzi=c.fenzi/d;
  85. c.fenmu=c.fenmu/d;
  86. return c;
  87. }
  88. }
  89. Divid.java
  90. package cn.edu.nefu.zhihu;
  91. public class Divid extends Yunsuanzi{
  92. Object divid(Youlishu a,Youlishu b){
  93. Youlishu c=new Youlishu(0,0);
  94. c.fenzi=a.fenzi*b.fenmu;
  95. c.fenmu=a.fenmu*b.fenzi;
  96. int d=gcd(c.fenzi,c.fenmu);
  97. c.fenzi=c.fenzi/d;
  98. c.fenmu=c.fenmu/d;
  99. return c;
  100. }
  101. }
  102. Youlishu.java
  103. package cn.edu.nefu.zhihu;
  104. public class Youlishu extends Object{
  105. int fenzi,fenmu;
  106. Youlishu(){
  107. }
  108. Youlishu(int fenzi,int fenmu){
  109. this.fenzi=fenzi;
  110. this.fenmu=fenmu;
  111. }
  112. void show(){
  113. System.out.println(fenzi+"/"+fenmu);
  114. }
  115. }
  116. Test.java
  117. package cn.edu.nefu.zhihu;
  118. import java.util.Scanner;
  119. public class test {
  120. public static void main(String[] args){
  121. Scanner reader=new Scanner(System.in);
  122. int x1,y1,x2,y2;
  123. x1=reader.nextInt();
  124. y1=reader.nextInt();
  125. x2=reader.nextInt();
  126. y2=reader.nextInt();
  127. Youlishu ylsa=new Youlishu(x1,y1);
  128. Youlishu ylsb=new Youlishu(x2,y2);
  129. Youlishu ylsc=new Youlishu(0,0);
  130. Add jia=new Add();
  131. ylsc=(Youlishu) jia.add(ylsa, ylsb);
  132. ylsc.show();
  133. Sub jian=new Sub();
  134. ylsc=(Youlishu) jian.sub(ylsa, ylsb);
  135. ylsc.show();
  136. Multi cheng=new Multi();
  137. ylsc=(Youlishu) cheng.multi(ylsa, ylsb);
  138. ylsc.show();
  139. Divid chu=new Divid();
  140. ylsc=(Youlishu) chu.divid(ylsa, ylsb);
  141. ylsc.show();
  142. }
  143. }

方法三代码实现:

  1. Yunsuan.java
  2. package cn.edu.nefu.zhihu;
  3. public abstract class Yunsuan {
  4. public abstract Object add(Object a);
  5. public abstract Object sub(Object a);
  6. public abstract Object multi(Object a);
  7. public abstract Object divid(Object a);
  8. public int gcd(int a,int b){
  9. if(b==0)
  10. return a;
  11. else
  12. return gcd(b,a%b);
  13. }
  14. public int lcm(int a,int b){
  15. return a*b/gcd(a,b);
  16. }
  17. }
  18. YouLiShu.java
  19. package cn.edu.nefu.zhihu;
  20. public class YouLiShu extends Yunsuan{
  21. int fenzi,fenmu;
  22. public YouLiShu(){}
  23. public YouLiShu(int fenzi ,int fenmu){
  24. this.fenzi=fenzi;
  25. this.fenmu=fenmu;
  26. }
  27. @Override
  28. public YouLiShu add(Object a) {
  29. YouLiShu y=(YouLiShu)a;
  30. YouLiShu z=new YouLiShu();
  31. int lcmm=lcm(fenmu,y.fenmu);
  32. z.fenmu=lcmm;
  33. int d1,d2;
  34. d1=lcmm/fenmu;
  35. d2=lcmm/y.fenmu;
  36. z.fenzi=d1*fenzi+d2*y.fenzi;
  37. int gcdd2=gcd(z.fenmu,z.fenzi);
  38. z.fenmu=z.fenmu/gcdd2;
  39. z.fenzi=z.fenzi/gcdd2;
  40. return z;
  41. }
  42. @Override
  43. public YouLiShu divid(Object a) {
  44. YouLiShu y=(YouLiShu)a;
  45. YouLiShu z=new YouLiShu();
  46. z.fenmu=fenmu*y.fenzi;
  47. z.fenzi=fenzi*y.fenmu;
  48. int gcdd2=gcd(z.fenmu,z.fenzi);
  49. z.fenmu=z.fenmu/gcdd2;
  50. z.fenzi=z.fenzi/gcdd2;
  51. return z;
  52. }
  53. @Override
  54. public YouLiShu multi(Object a) {
  55. YouLiShu y=(YouLiShu)a;
  56. YouLiShu z=new YouLiShu();
  57. z.fenmu=fenmu*y.fenmu;
  58. z.fenzi=fenzi*y.fenzi;
  59. int gcdd2=gcd(z.fenmu,z.fenzi);
  60. z.fenmu=z.fenmu/gcdd2;
  61. z.fenzi=z.fenzi/gcdd2;
  62. return z;
  63. }
  64. @Override
  65. public YouLiShu sub(Object a) {
  66. YouLiShu y=(YouLiShu)a;
  67. YouLiShu z=new YouLiShu();
  68. z.fenmu=fenmu*y.fenmu;
  69. z.fenzi=fenzi*y.fenmu-fenmu*y.fenzi;
  70. int gcdd2=gcd(z.fenmu,z.fenzi);
  71. z.fenmu=z.fenmu/gcdd2;
  72. z.fenzi=z.fenzi/gcdd2;
  73. return z;
  74. }
  75. public String toString(){
  76. return (fenzi+"/"+fenmu);
  77. }
  78. public double toXiaoShu(){
  79. return fenzi*1.0/fenmu;
  80. }
  81. }
  82. Test.java
  83. package cn.edu.nefu.zhihu;
  84. public class Test {
  85. public static void main(String[] args) {
  86. YouLiShu x=new YouLiShu(2,3);//匿名对象
  87. YouLiShu y=new YouLiShu();
  88. y=x.add(new YouLiShu(3,2));
  89. System.out.println(y.toString());
  90. System.out.println(y.toXiaoShu());
  91. y=x.sub(new YouLiShu(1,3));
  92. System.out.println(y.toString());
  93. System.out.println(y.toXiaoShu());
  94. y=x.multi(new YouLiShu(1,4));
  95. System.out.println(y.toString());
  96. System.out.println(y.toXiaoShu());
  97. y=x.divid(new YouLiShu(3,2));
  98. System.out.println(y.toString());
  99. System.out.println(y.toXiaoShu());
  100. }
  101. }

发表评论

表情:
评论列表 (有 0 条评论,173人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java适配器模式

    java适配器模式 前言 1,创建报表顶层接口 2,更多其他报表接口 3,实现其他报表接口 4,创建适配器,适配器需实现报表顶层接口

    相关 java适配器模式之类适配器

    一.类适配器模式 定义:适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。 原理:通

    相关 Java 适配器模式

    什么是适配器模式:                   就是将一个类的接口转换成客户需要的另一个接口,它的职责是将本来不能在一起工作的类,可以一起工作。 适配器模式中的角色