结构型模式-代理模式
7.2代理模式⬆️⬆️⬆️
7.2.1概念
代理模式通过引入一个新的代理对象来控制对原始对象的访问。而代理对象充当了调用者与真实对象之间的中介,调用者通过代理对象来访问真实对象。代理模式可以在不修改原有目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
7.2.2场景
在我们去某个地方旅游时,我们可以报名旅行社,通过旅行社来给我们安排行程、酒店、机票等等一些服务,旅行社就是我们去旅游时的代理对象,他们代表我们与航空公司、酒店、旅游景点等去进行交涉和预订,为我们提供我们在某个地方时的各种旅游服务。
7.2.3优势 / 劣势
- 增强安全性:隐藏被代理对象的复杂性,隐藏其详细信息,使得调用者不需要与被代理对象进行交互
- 提高扩展性:在不修改被代理对象的前提下,提供额外的功能操作,扩展被代理对象的功能
- 增加系统复杂性:实现代理模式需要额外的工作/代码,有些代理模式的实现过程较为复杂
- 降低系统性能:增加一个代理对象会导致请求处理速度变慢,因为代理对象需要进行额外的操作
7.2.4代理模式可分为
- 抽象主题Subject:抽象类,通过接口或抽象类声明真实主题和代理对象实现的业务方法
- 真实主题RealSubject:定义了Proxy所代表的真实对象,是客户端最终要访问的对象
- 代理Proxy:包含一个引用,该引用可以是RealSubject的实例,控制对RealSubject的访问,并可能负责创建和删除RealSubject的实例
7.2.5代理模式
package com.technologystatck.designpattern.mode.proxy;
public class Proxy {
public static void main(String[] args) {
ProxyClass proxyClass = new ProxyClass();
proxyClass.request();
}
}
//1.定义抽象主题,声明真实主题和代理对象实现的业务方法
interface Subject{
void request();
}
//2.定义真实主题,实现抽象主题中的具体业务
class RealSubject implements Subject{
@Override
public void request() {
System.out.println("RealSubject handles the request.");
}
}
//3.定义代理类,包含对RealSubject的引用,并提供和真实主题相同的接口,
//然后该代理就可以替代真实主题,对真实主题进行功能扩展
class ProxyClass implements Subject{
private RealSubject realSubject;
@Override
public void request() {
//在访问真实主题之前可以添加额外的逻辑
if(realSubject == null){
realSubject = new RealSubject();
}
//调用真实主题的方法
realSubject.request();
//在访问真实主题之后可以添加额外的逻辑
}
}
7.2.6实战
7.2.6.1题目描述
小明想要购买一套房子,他决定寻求一家房屋中介来帮助他找到一个面积超过100平方米的房子,只有符合条件的房子才会被传递给小明查看。
7.2.6.2输入描述
第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。
接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。
7.2.6.3输出描述
对于每个房子,输出一行,表示是否符合购房条件。如果房屋面积超过100平方米,输出 “YES”;否则输出 “NO”。
7.2.6.4代码
package com.technologystatck.designpattern.mode.proxy;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int nums = scanner.nextInt();
scanner.nextLine();
IntermediaryProxy intermediaryProxy = new IntermediaryProxy();
for(int i=0;i<nums;i++){
int houseArea = scanner.nextInt();
//直接放入中介代理类去判断是否符合想要的房子面积
intermediaryProxy.requestPurchase(houseArea);
}
}
}
//抽象主题,抽象一个买房子方法
interface HomePurchase{
void requestPurchase(int area);
}
//真实主题,相当于买家直接购买房子
class HomeBuyer implements HomePurchase{
@Override
public void requestPurchase(int area) {
System.out.println("YES");
}
}
//代理类,相当于中介
class IntermediaryProxy implements HomePurchase{
//实例化买家
private HomeBuyer homeBuyer= new HomeBuyer();
@Override
public void requestPurchase(int area) {
if(area > 100){
homeBuyer.requestPurchase(area);
}else{
System.out.println("NO");
}
}
}