? 代理模式通过引入一个新的代理对象来控制对原始对象的访问。而代理对象充当了调用者与真实对象之间的中介,调用者通过代理对象来访问真实对象。代理模式可以在不修改原有目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
? 在我们去某个地方旅游时,我们可以报名旅行社,通过旅行社来给我们安排行程、酒店、机票等等一些服务,旅行社就是我们去旅游时的代理对象,他们代表我们与航空公司、酒店、旅游景点等去进行交涉和预订,为我们提供我们在某个地方时的各种旅游服务。
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();
//在访问真实主题之后可以添加额外的逻辑
}
}
小明想要购买一套房子,他决定寻求一家房屋中介来帮助他找到一个面积超过100平方米的房子,只有符合条件的房子才会被传递给小明查看。
第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。
接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。
对于每个房子,输出一行,表示是否符合购房条件。如果房屋面积超过100平方米,输出 “YES”;否则输出 “NO”。
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");
}
}
}