【2】设计模式-代理模式

为其他对象提供一种代理以控制对这个对象的访问。

典型案例:spring aop

说明:

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

案例1:

我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。

(1)创建一个接口。

public interface Image {
void display();
}

(2)创建接口实现类

public class RealImage implements Image {

private String fileName;

public RealImage(String fileName){
 this.fileName = fileName;
 loadFromDisk(fileName);
}

@Override
public void display() {
 System.out.println("Displaying " + fileName);
}

private void loadFromDisk(String fileName){
 System.out.println("Loading " + fileName);
}
}
public class ProxyImage implements Image{

private RealImage realImage;
private String fileName;

public ProxyImage(String fileName){
 this.fileName = fileName;
}

@Override
public void display() {
 if(realImage == null){
    realImage = new RealImage(fileName);
 }
 realImage.display();
}
}

(3)当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。

public class ProxyPatternDemo {
public static void main(String[] args) {
 Image image = new ProxyImage("test_10mb.jpg");
  // 图像将从磁盘加载
 image.display(); 
 System.out.println("");
 // 图像不需要从磁盘加载
 image.display();  
}
}

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg


案例2:

//代理接口
public interface ProxyInterface {
//需要代理的是结婚这件事,如果还有其他事情需要代理,比如吃饭睡觉上厕所,也可以写
void marry();
//代理吃饭(自己的饭,让别人吃去吧)
//void eat();
//代理拉屎,自己的屎,让别人拉去吧
//void shit();
}

婚庆公司的代码:

public class WeddingCompany implements ProxyInterface {

private ProxyInterface proxyInterface;

public WeddingCompany(ProxyInterface proxyInterface) {
 this.proxyInterface = proxyInterface;
}

@Override
public void marry() {
 System.out.println("我们是婚庆公司的");
 System.out.println("我们在做结婚前的准备工作");
 System.out.println("节目彩排...");
 System.out.println("礼物购买...");
 System.out.println("工作人员分工...");
 System.out.println("可以开始结婚了");
 proxyInterface.marry();
 System.out.println("结婚完毕,我们需要做后续处理,你们可以回家了,其余的事情我们公司来做");
}

}

结婚家庭的代码:

public class NormalHome implements ProxyInterface{

@Override
public void marry() {
 System.out.println("我们结婚啦~");
}

}

测试代码:

public class Test {
public static void main(String[] args) {
 ProxyInterface proxyInterface = new WeddingCompany(new NormalHome());
 proxyInterface.marry();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值