代理设计模式

文章的思路定义多需要感谢《大话设计模式》这本书,提供的案例可以让读者很容易理解。有什么不对的地方希望大家指导。

代理模式:为其他对象提供一种代理以控制对这个对象的访问(租房中介就是代理,webservice就是一个很好的代理案例,Nginx的使用都利用的代理的思想,hibernate中的CGlib也是使用的代理的思想)。

常见的代理有:

  1. 远程代理(Remote Proxy):对一个位于不同的地址空间对象提供一个局域代表对象,如RMI中的stub
  2. 虚拟代理(Virtual Proxy):根据需要将一个资源消耗很大或者比较复杂的对象,延迟加 载,在真正需要的时候才创建
  3. 安全代理(Protect or Access Proxy):控制对一个对象的访问权限。
  4. 智能引用(Smart Reference Proxy):提供比目标对象额外的服务和功能。

形象举例(代理和装饰模式):

代理模式:在不改变接口的前提下,控制对象的访问

例子:孙悟空扮演并代替高家三小姐

孙悟空扮演高家三小姐,所以可以说孙悟空与高家三小姐具有共同的接口。如果猪八戒只想 见见高家三小姐的娇好面容,或者谈谈天说说地,那么高家三小姐的“代理”孙悟空是允许 的,但猪八戒想亲亲嘴,那么是不行的。这是保护代理模式的应用。只有代理对象认为合适 时,才会将客户端的请求传递给真实主题对象。

装饰模式:在不改变接口的前提下,动态扩展对象的功能

孙悟空有七十二般变化,在二郎神眼里,他永远是那只猢狲。装饰模式以对客户透明的方式 动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有 什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。他的每 一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿时, 就可以在天上飞行。而不管悟空怎么变化,在二郎神眼里,他永远是那只猢狲。装饰模式以 对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在 装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能 加以扩展。


代理的实现步骤:

1.创建代理接口;定义实现方法

2.创建被代理类(追求类)实现代理接口,编写为了目的需要实现的方法逻辑(功能)

3.创建代理类,实现代理接口,代理类中创建被代理类对象;通过创建的被代理类对象来调用自身定义好的目标方法;

4.创建 被追求者类(目标类),目标类指定给代理类,通过代理来来实现追求者的目的;这是被追求者只知道代理者,而不知道追求者,


代码:

1.//代理接口

public interface GiveGift {
//定义方法
public void GiveDolls();
public void GiveFloers();
public void GiveChocolate();
}

2.//追求者类
public class Pursuit implements GiveGift {
public SchoolGirl schoolGirl;
public Pursuit(SchoolGirl schoolGirl) {
super();
this.schoolGirl = schoolGirl;
}
@Override
public void GiveDolls() {
System.out.println(schoolGirl.getName()+"送你洋娃娃");

}
@Override
public void GiveFloers() {
System.out.println(schoolGirl.getName()+"送你鲜花");
}
@Override
public void GiveChocolate() {
System.out.println(schoolGirl.getName()+"送你巧克力");
}
}

3.//代理类,代理类和追求类有共同的方法和功能
public class Proxy implements GiveGift {
public Pursuit pursuit;
//代理类实现追求者的方法;来完成追求者的任务
public Proxy(SchoolGirl schoolGirl) {
super();
this.pursuit = new Pursuit(schoolGirl);
}
@Override
public void GiveDolls() {
pursuit.GiveDolls();
}
@Override
public void GiveFloers() {
pursuit.GiveFloers();
}
@Override
public void GiveChocolate() {
pursuit.GiveChocolate();
}
}

4.测试类

public class proxyMain {
public static void main(String[] args) {
//定义要送的对象
SchoolGirl schoolGirl = new SchoolGirl();
schoolGirl.setName("许某");
//创建代理类
//把要送的对象通知给代理类
Proxy proxy = new Proxy(schoolGirl);
//通过代理类来实现追求者的要求;这样李娇娇就只知道代理不知道追求者但是也达到了了目的
proxy.GiveDolls();
proxy.GiveFloers();
proxy.GiveChocolate();

}
}

5.结果:

许某送你洋娃娃
许某送你鲜花
许某送你巧克力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的代理设计模式是一种结构型设计模式。它允许一个对象(代理)代替另一个对象(被代理对象)来访问其方法。代理对象可以通过实现与被代理对象相同的接口或继承相同的父类来完成这个任务。 代理对象可以在不改变被代理对象的基本逻辑的情况下,为其添加额外的功能,例如记录日志、缓存数据、权限控制等。代理对象还可以对被代理对象的方法进行验证或重写。 在Java中,代理模式有两种实现方式:静态代理和动态代理。静态代理需要手动编写代理类,而动态代理则是在运行时动态生成代理对象。 静态代理示例代码: ```java public interface Subject { void doSomething(); } public class RealSubject implements Subject { public void doSomething() { System.out.println("RealSubject doSomething"); } } public class ProxySubject implements Subject { private RealSubject realSubject; public ProxySubject() { realSubject = new RealSubject(); } public void doSomething() { System.out.println("Before doSomething"); realSubject.doSomething(); System.out.println("After doSomething"); } } public class Client { public static void main(String[] args) { Subject subject = new ProxySubject(); subject.doSomething(); } } ``` 动态代理示例代码: ```java public interface Subject { void doSomething(); } public class RealSubject implements Subject { public void doSomething() { System.out.println("RealSubject doSomething"); } } public class ProxyHandler implements InvocationHandler { private Object target; public ProxyHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before " + method.getName()); Object result = method.invoke(target, args); System.out.println("After " + method.getName()); return result; } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); ProxyHandler proxyHandler = new ProxyHandler(realSubject); Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), proxyHandler); proxySubject.doSomething(); } } ``` 以上是两种代理模式的示例代码。静态代理需要手动编写代理类,但是代理对象的生成在编译时就已经完成。动态代理则是在运行时动态生成代理对象,可以避免代码重复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值