代理模式
一、完成者信息:
姓名:杨郅昱
学号:07770121
二、模式信息
模式名称:代理模式
生活场景:判定是否是三角形然后求出面积:任意给定三个数,先判断是否能构成三角形 如果能构成三角形,在求出三角形的面积。
1. 不假思索的思路:通过类继承的方式来做上面的例子。即:任意给定三个数字, 用一个类继承运算接口,先判定能否构成三角形,如果能,求出面积;如果不能,则停止运行。
2. 类结构图:
代码浏览:
代码
package com.yzy.ProxyTest;
public interface Geometry {
public double getArea();
}
public class TriangleProxy implements Geometry {
double sideA,sideB,sideC;
Triangle triangle;
public void setABC(double a,double b,double c){
sideA = a;
sideB = b;
sideC = c;
}
public double getArea1(){
double p = (sideA + sideB + sideC)/2.0;
double area = Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
return area;
}
public double getArea(){
if((sideA+sideB)>sideC&&(sideB+sideC)>sideA&&(sideA+sideC)>sideB){
triangle = new Triangle(sideA,sideB,sideC);
double area = triangle.getArea();
return area;
}else
return 0;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入三角形的三个数,每输入一个数按回车确认");
double a = -1,b= -1,c= -1;
a = scan.nextDouble();
b = scan.nextDouble();
c = scan.nextDouble();
TriangleProxy proxy = new TriangleProxy();
proxy.setABC(a, b, c);
double area = proxy.getArea();
System.out.println("面积是:"+area);
}
}
1. 存在问题:
1. 当调入大量信息时会发费很长时间。
2. 进行判定和计算都在一个类中进行,需要大量的时间。
3. 如果判定规则变动,则需要大量的修改。
2.归纳阶段
归纳步骤一
当前目标:实现通过一个代理来处理请求,并将符合要求的请求发给实现类。
思路:通过建立一个代理的类,当发来消息时,通过它来判断是否能构成三角形。如果能构成三角形,将请求发给实现类进行面积的计算;如果不能构成三角形直接返回一个空值。
代码浏览:
代码
package com.yzy.ProxyTest;
public interface Geometry {
public double getArea();
}
/**
*
*/
package com.yzy.ProxyTest;
/**
* 具体模板 实际主题 是实现抽象主题接口的类
*
*/
public class Triangle implements Geometry {
double sideA,sideB,sideC,area;
public Triangle(double a,double b,double c){
sideA = a;
sideB = b;
sideC = c;
}
public double getArea(){
double p = (sideA + sideB + sideC)/2.0;
area = Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
return area;
}
}
/**
*
*/
package com.yzy.ProxyTest;
/**
* 代理类 实现抽象主题的接口 为其他对象提供一种代理以控制这个对象的访问
*
*/
public class TriangleProxy implements Geometry {
double sideA,sideB,sideC;
Triangle triangle;
public void setABC(double a,double b,double c){
sideA = a;
sideB = b;
sideC = c;
}
public double getArea(){
if((sideA+sideB)>sideC&&(sideB+sideC)>sideA&&(sideA+sideC)>sideB){
triangle = new Triangle(sideA,sideB,sideC);
double area = triangle.getArea();
return area;
}else
return 0;
}
}
package com.yzy.ProxyTest;
import java.util.Scanner;
public class Application {
/**
* 模式的使用 赋值后先调用代理 判定是否是三角形 然后用代理去调用具体模板的算法 计算三角形的面积 把数值返回
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入三角形的三个数,每输入一个数按回车确认");
double a = -1,b= -1,c= -1;
a = scan.nextDouble();
b = scan.nextDouble();
c = scan.nextDouble();
TriangleProxy proxy = new TriangleProxy();
proxy.setABC(a, b, c);
double area = proxy.getArea();
System.out.println("面积是:"+area);
}
}
设计体会:
1.代理模式可以省去在一个类中判定三角形和计算面积浪费的时间,用两个类分别进行判定和计算可以有效的提高工作效率。
2.运用代理模式可以有效的过滤无用参数,当给定的数值无法构成三角形,那么代理类会先进行阻拦,不会将无用的信息传递。
3.如果判定条件有变化,可以直接将代理条件改变即可
3.验证阶段:
当前目标:增加代理条件(三条边必须都大于10),证明该模式的适用性;
类结构图:
代码浏览:
代码
package com.yzy.ProxyTest;
public interface Geometry {
public double getArea();
}
/**
*
*/
package com.yzy.ProxyTest;
/**
* 具体模板 实际主题 是实现抽象主题接口的类
*
*/
public class Triangle implements Geometry {
double sideA,sideB,sideC,area;
public Triangle(double a,double b,double c){
sideA = a;
sideB = b;
sideC = c;
}
public double getArea(){
double p = (sideA + sideB + sideC)/2.0;
area = Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
return area;
}
}
/**
*
*/
package com.yzy.ProxyTest;
/**
* 代理类 实现抽象主题的接口 为其他对象提供一种代理以控制这个对象的访问
*
*/
public class TriangleProxy implements Geometry {
double sideA,sideB,sideC;
Triangle triangle;
public void setABC(double a,double b,double c){
sideA = a;
sideB = b;
sideC = c;
}
public double getArea(){
if((sideA+sideB)>sideC&&(sideB+sideC)>sideA&&(sideA+sideC)>sideB){
triangle = new Triangle(sideA,sideB,sideC);
double area = triangle.getArea();
return area;
}else
return 0;
}
}
package com.yzy.ProxyTest;
public class Proxy implements Geometry {
double sideA,sideB,sideC;
Triangle triangle;
public void setABC(double a,double b,double c){
sideA = a;
sideB = b;
sideC = c;
}
public double getArea() {
if(sideA>10||sideB>10||sideC>10){
triangle = new Triangle(sideA,sideB,sideC);
double area = triangle.getArea();
return area;
}else
return 0;
}
}
package com.yzy.ProxyTest;
import java.util.Scanner;
public class Application {
/**
* 模式的使用 赋值后先调用代理 判定是否是三角形 然后用代理去调用具体模板的算法 计算三角形的面积 把数值返回
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入三角形的三个数,每输入一个数按回车确认");
double a = -1,b= -1,c= -1;
a = scan.nextDouble();
b = scan.nextDouble();
c = scan.nextDouble();
TriangleProxy proxy = new TriangleProxy();
Proxy proxy1 = new Proxy();
proxy.setABC(a, b, c);
proxy1.setABC(a, b, c);
double area = proxy.getArea();
area = proxy1.getArea();
System.out.println("面积是:"+area);
}
}
验证结论:
1. 代理模式可以随时添加限定条件只需添加相应的代理类而不用在原类中进行改动,大大加强了代码的灵活性。
2. 当多个数据输入进来时,代理可以及时的进行判断是否符合要求,过滤相应的无用请求,大大减少了时间,提高了工作效率。
抽象图: