设计模式之代理模式

来源:互联网 发布:mac版 拳皇98 模拟器 编辑:程序博客网 时间:2024/06/06 22:46

俗话说大学不逃课青春就不完美了,在我上大学的时候也经常逃,大课必逃小课选逃。但是逃课也会带来一些苦恼,比如说老师点名,万一没点到名字平时分没了,期末挂科那就真死翘翘了。一次两次被抓后,我就想到为何不叫其他厉害的人帮忙点个到呢(这里厉害的人就是指那些可以模仿多人口音的家伙)!幸好还真有这样的人才,所以我就跟他努力搞好关系,平时上课我就可以睡懒觉了,让他帮我点个名。有这样的一段经历还是挺有意思的,作为一个码农我觉得应该把它的过程系统化,所以我就想到了设计模式中的代理模式。

以下是一个简单的示例程序:

点名接口

package com.check;public interface ICheck {//上课public void goToClass();//点名public void check();//蒙混过关public void succeed();}
学生

package com.check;public class Student implements ICheck{private String name = "";public Student(String _name){this.name = _name;}@Overridepublic void goToClass() {// TODO Auto-generated method stubSystem.out.println(this.name + "来到教室上课,老师开始点名。");}@Overridepublic void check() {// TODO Auto-generated method stubSystem.out.println(this.name + "帮我答到");}@Overridepublic void succeed() {// TODO Auto-generated method stubSystem.out.println(this.name + "蒙混过关,成功帮我答到.");}}

代理者

package com.check;public class StudentProxy implements ICheck{private ICheck m_student = null;public StudentProxy(ICheck _student){this.m_student = _student;}@Overridepublic void goToClass() {// TODO Auto-generated method stubthis.m_student.goToClass();}@Overridepublic void check() {// TODO Auto-generated method stubthis.m_student.check();}@Overridepublic void succeed() {// TODO Auto-generated method stubthis.m_student.succeed();}}

场景类

package com.check;import com.check.ICheck;import com.check.Student;public class Client {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubICheck student = new Student("小乔");//定义代练者ICheck proxy = new StudentProxy(student);proxy.goToClass();proxy.check();proxy.succeed();System.out.println("终于下课了");}}

运行结果如下:


运行结果也是我想要的,有人再帮你点名啊!


代理模式是一个使用率很高的模式,它是为其他对象提供一种代理来控制对这个对象的操作访问。

代理模式的通用类图如下:


Subject抽象主题角色:可以是抽象类也可以是借口,是一个最普通的业务类型定义。

RealSubject具体主题橘色:也叫做委托对象,是业务逻辑的具体执行着。

Proxy代理主题角色:委托类,代理类,它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

我们首先来看一下类图的通用代码:

public interface Subject{public void request();}public class RealSubject implements Subject{public void request(){//业务逻辑处理}}public class Proxy implements Subject{//要代理哪个实现类private Subject subject = null;public Proxy(){this.subject = new Proxy();}//通过构造函数传递代理者public Proxy(Object...objects){}public void request(){this.before();this.subject.request();this.after();}//预处理private void before(){}//善后处理private void after(){}}

一个代理类可以代理多个被委托者或被代理者,因此一个代理类具体代理哪个真实主题角色,是由场景类决定的。通常情况下,一个接口只需要一个代理类就可以了,具体代理哪个实现类由高层模块来决定,也就是在代理类的构造函数中传递被代理者。

关于代理模式的优点:

1:不用关心其他非本职责的事物,可以通过后期的代理完成一件事物

2:具体角色是随时变化的,只要他实现了接口,那我们的代理类完全就可以在不做任何修改的情况下使用。

关于代理模式,有兴趣的可以去看看虚拟代理与动态代理,今天就到此,欢迎大家批评指正。










0 0
原创粉丝点击