装饰和代理的区别

装饰是在原有类上增加功能用的
代理是对原有类作限制用的
机制差不多,但语义上方向相反

————————————————————————

追美女的一种方式是从她的朋友下手,让她的死党帮忙,那就离成功没有多远了。好,我们把她的死党作为这个美女的代理,开始的时候我们当然要和代理打交道了,我们用代理模式实现以下。定义一个接口,这个借口有一个behavior()方法。

  1. 1.public interface Girl {
  2. 2.
  3. 3.    public void behavior();
  4. 4.
  5. 5.}
1.public interface Girl {
2.
3.    public void behavior();
4.
5.}

然后让美女类实现这个接口

  1. 1.public class NiceGirl implements Girl {
  2. 2.
  3. 3.    private String name;
  4. 4.    public NiceGirl(String name){
  5. 5.        this.name = name;
  6. 6.    }
  7. 7.    @Override
  8. 8.    public void behavior() {
  9. 9.        System.out.println(this.name+"长的非常nice");
  10. 10.        System.out.println(this.name+"说话也非常nice");
  11. 11.
  12. 12.    }
  13. 13.
  14. 14.}
1.public class NiceGirl implements Girl {
2.
3.    private String name;
4.    public NiceGirl(String name){
5.        this.name = name;
6.    }
7.    @Override
8.    public void behavior() {
9.        System.out.println(this.name+"长的非常nice");
10.        System.out.println(this.name+"说话也非常nice");
11.
12.    }
13.
14.}

接下来定义代理类,代理类也实现了Girl接口,不但如此,代理类还要关联它要代理的对象,所以要定义Girl类型的一个成员变量,

  1. 1.import java.util.Random;
  2. 2.
  3. 3.public class GirlAgent implements Girl {
  4. 4.
  5. 5.    private Girl girl;
  6. 6.
  7. 7.    public GirlAgent(Girl girl) {
  8. 8.        super();
  9. 9.        this.girl = girl;
  10. 10.    }
  11. 11.
  12. 12.    @Override
  13. 13.    public void behavior() {
  14. 14.        Random rand = new Random();
  15. 15.        if(rand.nextBoolean())
  16. 16.        {
  17. 17.            System.out.println("我安排你们上自习");
  18. 18.            girl.behavior();
  19. 19.        }
  20. 20.        else{
  21. 21.            System.out.println("先看你的表现,上自习以后再说");
  22. 22.        }
  23. 23.    }
  24. 24.}
1.import java.util.Random;
2.
3.public class GirlAgent implements Girl {
4.
5.    private Girl girl;
6.
7.    public GirlAgent(Girl girl) {
8.        super();
9.        this.girl = girl;
10.    }
11.
12.    @Override
13.    public void behavior() {
14.        Random rand = new Random();
15.        if(rand.nextBoolean())
16.        {
17.            System.out.println("我安排你们上自习");
18.            girl.behavior();
19.        }
20.        else{
21.            System.out.println("先看你的表现,上自习以后再说");
22.        }
23.    }
24.}

OK,代理类图中的所有的类都实现了,下面编写一个测试类

  1. 1.public class Client {
  2. 2.
  3. 3.    public static void main(String[] args) {
  4. 4.
  5. 5.      Girl niceGirl = new NiceGirl("小美");
  6. 6.
  7. 7.      Girl friend = new GirlAgent(niceGirl);
  8. 8.
  9. 9.      friend.behavior();
  10. 10.    }
  11. 11.
  12. 12.}
1.public class Client {
2.
3.    public static void main(String[] args) {
4.
5.      Girl niceGirl = new NiceGirl("小美");
6.
7.      Girl friend = new GirlAgent(niceGirl);
8.
9.      friend.behavior();
10.    }
11.
12.}

哈哈,代理模式就学会了吧。那装饰模式是怎么回事呢?装饰模式只要改动一处代码就可以了,对代理类的behavior()方法改动如下,其他的类不用动。

    1. @Override
    2. 2.       public void behavior() {
    3. 3.
    4. 4.System.out.println("我家MM不但知书达礼,而且还会做饭");
    5. 5.girl.behavior();
    6. 6.
    7. 7.        }
时间: 2024-10-23 08:00:53

装饰和代理的区别的相关文章

代理模式与装饰器模式的区别

代理模式与装饰器模式的区别,主要大于,从使用者(客户端)的角度来看的: //装饰器的客户public class Client{ public static void main(String[] args){ //客户指定了装饰者需要装饰的是哪一个类 Component component = new Decorator(new ConcreteComponent()); - }}//代理的客户public class Client{ public static void main(String

正向代理与反向代理的区别

本文转载自:http://blog.csdn.net/m13666368773/article/details/8060481 一.正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我.从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也

【nginx】【转】正向代理与反向代理的区别[

转自: http://blog.csdn.net/m13666368773/article/details/8060481 正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容代理服务器去取回来,然后返回给我 从网站的角度,只在代理服务器来取内容的时候有一次记录有时候并不知道是用户的请求,也隐藏了用户的资料

编程常用设计模式详解--(中篇)(适配器、装饰、代理、外观、桥接、组合、享元)

摘自:http://blog.csdn.net/zhangerqing/article/details/8239539 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,我们看下面的图: 6.适配器模式(Adapter) 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器

装饰和继承的区别

子类用的技术都是一样的,那么有必要给他单独定一个子类吗? 这就是装饰模式生成的原因. class MyBufferReader{ MyBufferedReader(被提高效率的类1 class){} MyBufferedReader(被提高效率的类2 class){} MyBufferedReader(被提高效率的类3 class){} } -------------------------------- 优化后的代码A: class MyBufferReader extends 父类{ pri

透明代理、正向代理、反向代理的区别说明

代理方式有三种:正向代理.透明代理和反向代理.反向代理比较容易理解,毕竟是运维必掌握的知识,但是对正向代理.透明代理可能比较模糊,所以主要解惑正向代理和透明代理. 透明代理 透明代理(transparent proxy),看名字就知道这个代理服务器是透明的,透明代理其实也叫做内网代理(inline proxy).拦截代理(intercepting proxy)以及强制代理(force proxy).透明代理和正向代理的行为很相似,但细节上有所不同.透明代理将拦截客户端发送的请求,拦截后自己代为访

jdk动态代理和cglib动态代理的区别

CGLIB代理: CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类. CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的. 如果目标对象实现了接口,可以强制使用CGLIB实现代理. 如果目标对象没有实现接口,则默认会采用CGLIB代理: 为什么jdk动态代理必须基于接口 原因如下: 1.生成的代理类继承了Proxy,由于java是单继承,所以只能实现接口,通过接口

Cglib和jdk动态代理的区别

动态代理解决了方法之间的紧耦合, IOC解决了类与类之间的紧耦合! Cglib和jdk动态代理的区别? 1.Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理 2. Cglib动态代理:利用ASM框架,对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理 什么时候用cglib什么时候用jdk动态代理? 1.目标对象生成了接口 默认用JDK动态代理 2.如果目标对象使

DK动态代理与CGLib动态代理的区别

参考:JDK动态代理与CGLib动态代理的区别对比 1).JDK和CGLib的区别 JDK动态代理只能对实现了接口的类生成代理,而不能针对类 CGLib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承) 2).Spring在选择用JDK还是CGLib的依据 当Bean实现接口时,Spring就会用JDK的动态代理 当Bean没有实现接口时,Spring使用CGLib来实现 可以强制使用CGLib(在Spring配置中加入<aop:aspectj-autoproxy proxy