作用:为对象提供一种代理以控制对这个对象的访问。
示例-代理模式:
名称
|
说明
|
Printer
|
表示命名的打印机类(本人)
|
Printable
|
Printer和PrinterProxy共享的接口
|
PrinterProxy
|
表示命名的打印机的类(代理)
|
Main
|
测试类
|
类图查看图片附件:类图-Proxy_1
//------------------------------------------ Printable类---------------------------------------------------------------
package proxy;
public interface Printable{
public abstract void setPrinterName(String name);//命名
public abstract String getPrinterName();//取得名称
public abstract void print(String string); //输出字符串(打印)
}
//------------------------------------------ Printer类---------------------------------------------------------------
package proxy;
public class Printer implements Printable{
private String name;
public Printer(){
heavyJob("正在产生Printer的实例对象");
}
public Printer(String name){
this.name = name;
heavyJob("正在产生Printer的对象实例(" + name + ")");
}
public void setPrinterName(String name){
this.name = name;
}
public String getPrinterName(){
return name;
}
public void print(String String){
System.out.println("==="+ name + " ===");
System.out.println(String);
}
private void heavyJob(String msg){
System.out.print(msg);
for(int i = 0; i < 10; i++){
try{
Thread.sleep(500);
} catch (InterruptedException e) {
}
System.out.print(".");
}
System.out.println("完成");
}
} //------------------------------------------ PrinterProxy 类---------------------------------------------------------------
package proxy;
public class PrinterProxy implements Printable {
private String name;//命名
private Printer real;//"本人"
public PrinterProxy(){
}
public PrinterProxy(String name){//构造函数
this.name = name;
}
public synchronized void setPrinterName(String name){//命名
if (real != null){
real.setPrinterName(name);//本人也要命名
}
this.name = name;
}
public String getPrinterName(){//取得名称
return name;
}
public void print(String String){//输出
realize();
real.print(String);
}
private synchronized void realize(){ //产生本人
if (real == null) {
real = new Printer(name);
}
}
}
//------------------------------------------测试类---------------------------------------------------------------
package proxy;
public class Main{
public static void main(String[] args){
Printable p = new PrinterProxy("Alice");
System.out.println("现在的名称是" + p.getPrinterName() + ".");
p.setPrinterName("BOb");
System.out.println("现在的名称是" + p.getPrinterName() + ".");
p.print("Hello,CCF~~");
}
}
解析:
PrinterProxy类和Printer类是一视同仁的,所以例外定义了Printable接口。设置名称(getName())、获得名称(setName())这样简单的任务就又代理来完成,需要打印(print),这样费时的任务就又本人来做,其中heavyJob()就模拟了这个费时性。
所谓“代理”,就是代替那个“本人”来做事,即为:本人将不需要自己做的事情外包出去,但是,这个代理能力范围有限,如果超出能力范围,就由本人自己来完成任务。
以下是Adapter Pattern模式解析:
代理模式参与者:
Subject-(主体)参与者,规定对Proxy参与者和RealSubject参与者一视同仁的接口。因为已经有Subject参与者,所以Client参与者就不需要去注意Proxy参与者与RealSubject参与者之间的差异,就如实例中的Printable接口一样。
Proxy-(代理)参与者,Proxy会尽量处理Client参与者的要求,当自己无法单独处理时,就会将工作交给RealSubject参与者。
RealSubject-(实际主体)参与者,就是“本人”角色,它和Proxy都实现了Subject参与者规定的接口
Client-接口调用参与者,在实例中是测试类充当了这个角色。
协作过程:代理根据其种类,在适当的时候向RealSubject转发请求。
代理模式实现类图见图片附件:类图-Proxy_2;
模式分析:
代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
适用性:
<1> Remote Proxy可以隐藏一个对象存在于不同地址空间的事实
<2> Virtual Proxy可以进行最优化,例如根据要求创建对象,这样利用代理提高了处理速度。
<3> Protection proxy等允许在访问一个对象时有一些附件的内务处理。
比较:
Adaper Pattern的功能是连接两个接口有差异的对象,Proxy Pattern的Proxy参与者和RealSubject参与者两者的接口并没有差异(也即具备穿透性)
Decorator Pattern跟Proxy Pattern的实现模式很相似,但是目的却不同。前者是为了新增功能,后者则是注重代替“本人”进行作业,以减少“本人”存取操作,或者延迟“本人”实例化时间。
- 大小: 40.4 KB
- 大小: 30 KB
分享到:
相关推荐
Proxy Pattern 代理模式 采用JAVA实现,可以下载看看。
实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...
### 代理模式 Proxy Pattern #### 概念定义 代理模式是一种结构型设计模式,它允许程序员为某对象创建一个代理对象来控制对该对象的访问。简单来说,就是在不修改原始类的基础上,通过引入代理对象来扩展类的行为...
结构型模式涉及到如何组合类和对象以形成更大的结构,例如适配器(Adapter)、装饰器(Decorator)、桥接(Bridge)、组合(Composite)、外观(Facade)、享元(Flyweight)和代理(Proxy)。这些模式有助于改善...
代理模式(Proxy Pattern)是一种常用的设计模式,提供了间接访问目标对象的一种方式,即通过代理对象访问目标对象。这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加额外的扩展功能。 代理模式...
代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于保护、延迟加载、记录请求等场景,可以在不改变原有对象的情况下为其增加新的功能。 代理...
代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...
在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该代理对象在客户端和目标对象之间起到中介的作用,可以增加额外的功能或控制访问。 代理模式分为两种...
- 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 组合模式(Composite):将对象组合成树形结构以表示部分-整体的层次结构,使客户可以一致地处理单个对象和组合对象。 - 外观模式...
**代理模式(Proxy Pattern)**是软件设计模式中的结构型模式之一,它在对象访问控制、增加额外功能或在客户端与目标对象之间提供一个中介等方面有广泛的应用。在代理模式中,代理类作为真实对象的代表,它持有真实...
代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象可以在原对象进行某些操作之前或之后添加额外的功能。代理模式的核心在于,它提供了一种方式来间接访问或控制目标对象,增加了系统的...
12. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。 这些模式都是Java设计模式中的重要组成部分,它们在实际项目中有着广泛的应用。了解和掌握这些模式,可以帮助开发者编写出更高效、更具扩展性的...
**代理模式**(Proxy Pattern)是一种在软件工程领域广泛使用的**设计模式**。它提供了一种非常有用的方法来控制对一个对象的访问,或者为实现某种功能提供间接层。代理模式的主要目的是通过代理对象来代表真实对象...
- **代理模式(Proxy Pattern)**:通过提供一个代理对象来控制对另一个对象的访问。可以用来实现延迟加载、日志记录等功能。 - **工厂模式(Factory Pattern)**:定义创建对象的接口,但让子类决定实例化哪一个类...
**设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...
结构型模式涉及如何组合对象和类,例如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)。行为型模式则关注对象间交互和职责分配,如策略模式(Strategy)、观察者模式(Observer)和责任链模式...
- **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。 - **装饰模式(Decorator)**:动态地给一个对象添加一些额外的职责。 - **适配器模式(Adapter)**:使两个不兼容的接口能够协同工作...
##### 4.7 代理模式 (Proxy Pattern) 代理模式为其他对象提供一个代理以控制对这个对象的访问。 - **目的**:为其他对象提供一个代理以控制对这个对象的访问。 - **优点**:客户端可以通过代理间接地访问目标对象...
12. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。C++11的智能指针可以作为简单代理,管理对象的生命周期。 13. **策略模式(Strategy)**:定义一系列的算法,把它们一个个封装起来,...