设计模式学习笔记(一)--代理模式

近日在研究设计模式,感觉代理模式是要重点掌握的,在这里记录一下。

什么是代理模式?比较官方的解释是:为其他对象设置一种代理以控制对实际对象的访问。

为了更好的理解代理模式,这里举个例子。在驻外现场,有一个项目经理、“二把手”和若干项目组成员,项目经理每天要安排项目组成员任务,主持晨会,写报告汇报工作进展。可是有几个月项目经理要回总部,这里就需要“二把手”来安排项目组成员任务,主持晨会,写报告汇报工作进展。而在这期间新来的同事只知“二把手”,而不识项目经理。

在上述例子中,“二把手”就是代理,新来的项目组成员只需要听吩咐做事,并不知道项目经理的存在。

该上图啦,代理模式如下图所示:

Subject类,定义了realSubject类和Proxy类的共用接口,这样就在任何使用realSubject的地方都可以使用Proxy。

realSubject类,定义Proxy所代表的真实实体。

Proxy类,保存一个引用使得代理可以访问实体,并提供一个和Subject的接口相同的接口,这样代理就可以用来代替实体。

代理模式Java代码实现如下:

 1 package designPattern;
 2
 3 /**
 4  * 代理模式
 5  * @author yiRain
 6  *
 7  */
 8 public class ProxyTest {
 9     public static void main(String[] args) {
10         Proxy erBaShou = new Proxy();
11         erBaShou.assignTasks();
12         erBaShou.handMeeting();erBaShou.report();
13     }
14
15 }
16
17 //Subject抽象类,定义realSubject类和Proxy类的共用接口
18 abstract class Subject{
19     public abstract void assignTasks();//安排工作任务
20     public abstract void handMeeting();//主持晨会
21     public abstract void report();//汇报工作
22 }
23
24 //RealSubject类,proxy代表的真实实体
25 //(项目经理)
26 class RealSubject extends Subject{
27     @Override
28     public void assignTasks(){
29         System.out.println("安排工作任务");
30     }
31
32     @Override
33     public void handMeeting() {
34         System.out.println("主持晨会");
35
36     }
37
38     @Override
39     public void report() {
40         System.out.println("汇报工作");
41
42     };
43 }
44
45 //Proxy类,保存一个引用使得代理可以访问实体,
46 //并提供一个和Subject的接口相同的接口,这样代理就可以用来代替实体
47 //(二把手)
48 class Proxy extends Subject{
49     RealSubject realSubject = new RealSubject();
50
51     @Override
52     public void assignTasks() {
53         realSubject.assignTasks();
54
55     }
56
57     @Override
58     public void handMeeting() {
59         realSubject.handMeeting();
60
61     }
62
63     @Override
64     public void report() {
65         realSubject.report();
66
67     }
68
69 }

原文地址:https://www.cnblogs.com/yiRain1992/p/8231961.html

时间: 2024-10-09 21:35:26

设计模式学习笔记(一)--代理模式的相关文章

设计模式学习笔记之代理模式

代理模式 为另一个对象提供一个替身或占位符以控制对这个对象的访问. 使用代理模式创建代表对象,让代表对象控制某个对象的访问,被代理的对象可以是远程的对象.创建开销大的对象或需要安全控制的对象. 在代理模式中的角色:  抽象对象角色(Subject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. 目标对象角色(RealSubject):定义了代理对象所代表的目标对象. 代理对象角色(Proxy):代理对象内部含有目标对象的引用,从而可以在任何时候操作

设计模式学习笔记--备忘录(Mamento)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--迭代(Iterator)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--访问者(Visitor)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem

大话设计模式读书笔记6——代理模式

代理模式: 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. UML结构如下图: 代码实现: //定义一个Subject 抽象类 public abstract class Subject { public abstract void Request(); } //定义一个RealSubject类,继承Subject public class RealSubject : Subject { public override void Request() { Console.W

[大话设计模式]学习笔记——简单工厂模式

序 说好的每天进步一点点的,结果工作太忙,一直在加班,都没有学习新东西.我还要进BAT呢. 坚持每天学习新东西. 写代码时,意识到在代码结构上还是有点欠缺.赶紧补上. 纪录对设计模式的认识.小菜变大鸟.进攻BAT. 应用场景: 编写一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 这本书使用C#写的.已有博主用JAVA写出来,参考:http://blog.csdn.net/ghsau/article/details/8163418 常见的做法: 写一个方法封装计算机的功能,我们只需传参

设计模式学习笔记之命令模式

命令模式 将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 说明: 1.命令模式将发出请求的对象和执行请求的对象解耦: 2.在被解耦的两者之间是通过命令对象进行沟通的.命令对象封装了接受者和一个或一组动作: 3.调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用: 4.调用者可以接受命令当做参数,甚至在运行时动态地进行: 5.命令可以支持撤销,做法事实现一个undo()方法来回到exexcute()被执行前的状态:

设计模式学习笔记--简单工厂模式

背景: 在开发过程中,经常会创建大量的对象,创建对象后还会涉及到一系列的初始化操作,而我们也不一定会只是在创建对象之后马上就使用对象,而且如果初始化操作很复杂,代码看起来就会非常杂乱,如果有变动,所有的初始化操作都要进行修改,相当难以维护. 功能: 将对象的创建和使用分离开来,专门用于创建对象并初始化.并且进行扩展后,可以根据参数不同,创建不同的对象. 例子: // 设计模式Demo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ