往期博客—>Java设计模式之工厂模式(2)
今天来学习一下23种设计模式之代理模式,路漫漫其修远兮啊,不急,慢慢来,虚心学习,一起进步.
代理模式
- 字面解释一波
我们想到代理就会联想到代理商,代理商干的事就是工厂或者公司生产产品由代理商来帮忙销售出售这些商品,我们不直接去工厂买,通过这些代理商购买产品,之前的工厂模式单例模式,类似我们直接去工厂购买.
- 定义:
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
- 代理模式的理解和作用:
1.代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。
2.代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。
比如一个实际的案例:工厂只负责生产家具,不干其他事,所以我们不能买家具直接去工厂买,所以我们去家具城,里面都是工厂生产的家具,我们通过家具城来实现去工厂购买家具一样的效果,那就是买到了家具.
- 代理模式的优点和缺点:
优点 | 缺点 |
---|---|
1、职责清晰。 2、高扩展性。 3、智能化。 | 1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。 |
- 代理模式的中有三种角色:
Subject: 抽象主题角色 | Proxy: 代理主题角色 | RealSubject: 真实主题角色 |
---|
代理模式的简单java代码实现:
- 整体构建的接口和类的说明:
接口或者类 | 说明 |
---|---|
interface bed | 定义一个床的接口 |
class Simmons | 定义一个席梦思类实现这个床的接口 |
class AgentSimmons | 定义一个代理席梦思类,由这个类来获取席梦思类 |
- 代码实现:
interface bed{
void sleep();
}
class Simmons implements bed{
private String name;
public Simmons(String name){
this.name=name;
buy(name);
}
@Override
public void sleep() {
System.out.println("舒舒服服睡一觉");
}
private void buy(String name){
System.out.println(name+"正在购买中");
}
}
class AgentSimmons implements bed{
private Simmons simmons;
private String name;
public AgentSimmons(String name){
this.name=name;
}
@Override
public void sleep() {
if (simmons == null){
simmons=new Simmons(name);
}
simmons.sleep();
}
}
- 测试一波:
public class Mytest03 {
public static void main(String[] args) {
bed simmons=new AgentSimmons("程序逸牌席梦思");
simmons.sleep();
System.out.println("-----");
simmons.sleep();
}
}
- 结果:
总结
- 我们没有直接创建Simmons这个具体实现类对象,而是通过代理类AgentSimmons使用接口获取的,因为当Simmons有这个类时,我们可以通过代理类来实现和真实类一样的功能,也就是我们之前说的,工厂虽然一直生产家具,但我们没必要直接去工厂买,我们去代理商购买可以实现一样的效果,我们的案例就是传入一个席梦思牌子,然后能睡觉就行.