简介
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
著名的代理模式例子为引用计数(英语:reference counting)指针对象。
当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
组成
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
优点
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
(3).高扩展性 [1]
模式结构
一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
代理模式分为静态代理、动态代理。
静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象
案例一 房东 中介 用户 三者之间的联系
package coms.Design.Mode.Demo1; /** * 代理模式 */ public interface Rent { public void rent(); }
package coms.Design.Mode.Demo1; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; public class Proxy implements Rent { private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } @Override public void rent() { host.rent(); } //看房子 public void seeHse() { System.out.println("中介带你看房子"); } //收费 public void money() { System.out.println("收中介费"); } //合同 public void Heh() { System.out.println("合同"); } }
package coms.Design.Mode.Demo1; //房东 租房 public class Host implements Rent{ @Override public void rent() { System.out.println("房东要租房子,要出租房子"); } }
package coms.Design.Mode.Demo1; /** * 操作的内容单一 */ public class Client { public static void main(String[] args) { Host host=new Host(); // host.rent(); //代理 Proxy proxy = new Proxy(host); proxy.rent(); proxy.seeHse(); proxy.money(); proxy.Heh(); } }
案例二 代理模式的更深层次的理解 以数据库的增删改查为例
package coms.Design.Mode.Demo02; public interface UserService { void adds(); void delete(); void update(); void query(); }
package coms.Design.Mode.Demo02; /** * 正式的对象 */ public class UserServiceImp implements UserService{ @Override public void adds() { System.out.println("增加一条数据"); } @Override public void delete() { System.out.println("删除一条数据"); } @Override public void update() { System.out.println("修改一条数据"); } @Override public void query() { System.out.println("查询一条数据"); } }
package coms.Design.Mode.Demo02; public class UserServiceProxy implements UserService { private UserServiceImp userService; public void setUserService(UserServiceImp userService){ this.userService=userService; } @Override public void adds() { log("增加"); userService.adds(); } @Override public void delete() { log("修改"); userService.delete(); } @Override public void update() { userService.update(); } @Override public void query() { userService.query(); } //日 public void log(String msg){ System.out.println("使用了msg想方法"); } }
package coms.Design.Mode.Demo02; public class Client { public static void main(String[] args) { UserServiceImp userService=new UserServiceImp(); // userService.adds(); // userService.delete(); // userService.query(); // userService.update(); UserServiceProxy proxy=new UserServiceProxy(); proxy.setUserService(userService); proxy.adds(); } }