精华内容
下载资源
问答
  • 之前接触过装饰模式和代理模式,一直都分不清楚两者的区别。今天看书以及查阅了一些资料终于有了个清晰认识,所以记录一下。装饰模式装饰模式就是动态地给一个对象添加一些额外地职责,可以达到增强一个对象功能...

    之前接触过装饰模式和代理模式,一直都分不清楚两者的区别。今天看书以及查阅了一些资料终于有了个清晰的认识,所以记录一下。

    装饰模式

    装饰模式就是动态地给一个对象添加一些额外地职责,可以达到增强一个对象功能的作用。也就是装饰来包裹一个真实的对象。

    看定义可能有点难理解,直接上代码。

    首先定义一个程序员接口

    /**
     * @author fanshanchao
     * @date 2019/4/17 21:45
     * 定义一个Programmer接口 只有一个敲代码的方法
     */
    public interface Programmer {
        void code();
    }

    顶一个java程序员类 实现接口

    /**
     * @author fanshanchao
     * @date 2019/4/17 21:52
     */
    public class JavaProgrammer implements Programmer {
        @Override
        public void code() {
            System.out.println("使用java敲代码");
        }
    }

    现在由于这位java程序员敲代码年数已久,头发已经变得稀少,然而这位程序员是个爱面子的java程序员,所以现在需要增强一下这个java程序员的敲代码方法,在敲代码之前戴他上刚买的假发。最简单粗暴的方法肯定是想到通过修改code方法,但是设计模式有个开发封闭原则,就是类可以增强,但不能修改,所以现在就用到了我们的装饰模式。

    我们先定义一个继承了Programmer类的ProgrammerDecorator类并且在构造方法中传入一个Programmer对象,然后在这个重写原来的code方法,具体看代码

    /**
     * @author fanshanchao
     * @date 2019/4/17 22:05
     * 定义一个java程序员装饰类 增强了之前的敲代码方法
     *
     */
    public class ProgrammerDecorator implements Programmer {
        private Programmer programmer;
        public ProgrammerDecorator(Programmer programmer){
            this.programmer = programmer;
        }
        @Override
        public void code() {
            wig();
            programmer.code();
        }
        /**
         * 戴假发方法
         */
        private void wig(){
            System.out.println("戴上新买的假发");
        }
    }

    现在看下使用了装饰模式的效果

    运行代码:

    public static void main(String[] args) {
        //新建一个java程序员对象
        Programmer javaProgrammer = new JavaProgrammer();
        //通过装饰类去增强一下程序员对象
        Programmer descProgrammer = new ProgrammerDecorator(javaProgrammer);
        //程序员执行敲代码动作
        descProgrammer.code();
    }

    运行结果:

    5a91cac5ba97f690828d042f36c2c6ef.png

    装饰模式的UML图

    dc608b8a37f1acaec6e677ef07c5e328.png

    代理模式

    代理模式就是为其他对象提供一种代理以控制对这个对象的访问。

    用代码继续讲解这个模式

    还是上面的程序员接口和java程序员实现类,现在由于java程序员已经戴上了假发,工作效率激增,并且可以写出一个很牛逼的软件。现在问题来了,你怎么去把这个软件给推销出去?再厉害的软件没人知道也是个不成功的软件。一般程序员只会写代码不会推销产品,所以现在需要一个销售代理程序员完成推销软件这个工作,而程序员只用关心自己需要做的,继续写好自己代码就行。具体看代码。

    定义一个销售类

    /**
     * @author fanshanchao
     * @date 2019/4/17 22:54
     */
    public class Sales implements Programmer {
        private JavaProgrammer programmer;
        public Sales(){
            this.programmer = new JavaProgrammer();
        }
        @Override
        public void code() {
            programmer.code();
            //写完代码后推销软件
            sale();
        }
        public void sale(){
            System.out.println("推销软件.......");
        }
    }

    运行代码:

    public static void main(String[] args) {
        //创建一个销售代理对象
        Programmer programmer = new Sales();
        programmer.code();
    }

    运行结果:

    b7fdaf7f735d96477b622c2d898e44d9.png

    代理模式的UML图

    cd23f18ca1bd6f5117eaae33403b04ed.png

    结论

    现在代理模式和装饰模式的具体效果以及实现已经出来了。看到这里代码理解还是很简单的,但是会发现装饰模式和代理模式是非常相似的,之前我就一直区别不来,其实从UML图也可看出来JavaProgrammer与Sales之前是有个关联关系的。在代理模式中我们增强方法是通过直接使用代理类,实际上我们代理的类对外是隐藏的,只能看到代理类。而装饰模式是通过自己传入需要被装饰的对象,然后再使用装饰过后的对象的增强方法。(两者都是对类的方法进行增强,但装饰器模式强调的是增强自身,在被装饰之后你能够够在被增强的类上使用增强后的方法。增强过后还是你,只不过能力变强了。而代理模式则强调要别人帮你去做一些本身与你业务没有太多关系的职责。代理模式是为了实现对象的控制,因为被代理的对象往往难以直接获得或者是其内部不想暴露出来。)括号里这段解释是看到知乎上一位大佬的回答,感觉讲的很好。

    在我们实际业务中装饰模式使用的案例就是IO类,经常可以看到一个流包装之后再包装。而代理模式的使用就有Spring AOP和Spring 事务。不过它们使用的是动态代理。因为普通的代理例如上面的例子称为静态代理,只能代理某一类对象,但在我们实际业务中不可能为每个类都去写一个代理类,所以这个时候就出现了动态代理。动态代理是使用反射的方法实现的,只用传入类的类型就可以达到增强类的方法。关于动态代理的使用有时间再复习一下吧.......

    展开全文
  • 设计模式中有很多种,这里介绍下面试中可能会被问到的一个问题:代理模式和装饰模式的区别。先看一下代理模式的设计图:再看一下代理模式的代码:第一步:定义一个接口:package ...

    设计模式中有很多种,这里介绍下面试中可能会被问到的一个问题:代理模式和装饰者模式的区别。

    先看一下代理模式的设计图:

    再看一下代理模式的代码:

    第一步:定义一个接口:

    package com.interview.designModel.agentModel;
    /**
     * 第一步:定义一个接口
     * @author EdwardShen
     *
     * 2018年4月13日
     */
    public interface Girl {
        void behavior();
    }
    
    
    

    第二步:定义接口的实现,即为被代理的类

    package com.interview.designModel.agentModel;
    /**
     * 第二步:定义真实的被代理的类
     * @author EdwardShen
     *
     * 2018年4月13日
     */
    public class NiceGirl implements Girl{
    	private String name;
    	public NiceGirl(String name)
    	{
    		this.name = name;
    	}
    
    	@Override
    	public void behavior() {
    		System.out.println(name+"说话很nice");
    		System.out.println(name+"长的很nice");
    	}
    	
    }
    

    第三步:定义代理类

    package com.interview.designModel.agentModel;
    
    import java.util.Random;
    
    /**
     * 第三步:定义代理类
     * 代理类,代理的对象是Girl
     * @author EdwardShen
     *
     * 2018年4月13日
     */
    public class GirlAgent implements Girl{
    	private Girl girl;
    	
    	public GirlAgent(Girl girl)
    	{
    		this.girl = girl;
    	}
    	
    	public void behavior()
    	{
    		Random random = new Random();
    		if(random.nextBoolean())
    		{
    			System.out.println("我安排你们上自习");
    			girl.behavior();
    		}
    		else
    		{
    			System.out.println("上完自习再说");
    		}
    	}
    }
    

    第四步:定义测试类

    package com.interview.designModel.agentModel;
    
    import org.junit.Test;
    
    /**
     * 第四步:定义测试类
     * 装饰者模式:可以对被代理的对象有控制权,决定被代理的对象执行还是不执行
     * @author EdwardShen
     *
     * 2018年4月13日
     */
    public class Client {
    	@Test
    	public void showInfo()
    	{
    		Girl girl = new NiceGirl("小美");
    		Girl friend = new GirlAgent(girl);
    		friend.behavior();
    	}
    }
    

    最后,正确的代码展示结果:

    我安排你们上自习
    小美说话很nice
    小美长的很nice
    
    或者
    上完自习再说
    

    装饰者模式的设计原理:

    对,你没有看错,是一毛一样的。

    接下来,看一下代码的实现。不同的地方,只有装饰类,其余不在展示

    package com.interview.designModel.decoratorModel;
    
    import com.interview.designModel.agentModel.Girl;
    /**
     * 装饰者需要与装饰的对象相关联
     * @author EdwardShen
     *
     * 2018年4月13日
     */
    public class GirlDecorator implements Girl{
    	private Girl girl;
    	public GirlDecorator(Girl girl)
    	{
    		this.girl = girl;
    	}
    
    	@Override
    	public void behavior() {
    		System.out.println("我的闺蜜不但知书达理,还会洗衣做饭");
    		girl.behavior();
    	}
    
    }
    

    正确的代码展示的结果

    我的闺蜜不但知书达理,还会洗衣做饭
    小美说话很nice
    小美长的很nice
    

    所以最终两者的区别是:

    代理模式:对于被代理的对象有控制权,可以执行或者不执行。

    装饰着模式:没有控制权,肯定会执行,但是增加了一层装饰的功能。

    展开全文
  • 之前接触过装饰模式和代理模式,一直都分不清楚两者的区别。今天看书以及查阅了一些资料终于有了个清晰认识,所以记录一下。装饰模式装饰模式就是动态地给一个对象添加一些额外地职责,可以达到增强一个对象功能...

    之前接触过装饰模式和代理模式,一直都分不清楚两者的区别。今天看书以及查阅了一些资料终于有了个清晰的认识,所以记录一下。

    装饰模式

    装饰模式就是动态地给一个对象添加一些额外地职责,可以达到增强一个对象功能的作用。也就是装饰来包裹一个真实的对象。

    看定义可能有点难理解,直接上代码。

    首先定义一个程序员接口

    /**
     * @author fanshanchao
     * @date 2019/4/17 21:45
     * 定义一个Programmer接口 只有一个敲代码的方法
     */
    public interface Programmer {
        void code();
    }

    顶一个java程序员类 实现接口

    /**
     * @author fanshanchao
     * @date 2019/4/17 21:52
     */
    public class JavaProgrammer implements Programmer {
        @Override
        public void code() {
            System.out.println("使用java敲代码");
        }
    }

    现在由于这位java程序员敲代码年数已久,头发已经变得稀少,然而这位程序员是个爱面子的java程序员,所以现在需要增强一下这个java程序员的敲代码方法,在敲代码之前戴他上刚买的假发。最简单粗暴的方法肯定是想到通过修改code方法,但是设计模式有个开发封闭原则,就是类可以增强,但不能修改,所以现在就用到了我们的装饰模式。

    我们先定义一个继承了Programmer类的ProgrammerDecorator类并且在构造方法中传入一个Programmer对象,然后在这个重写原来的code方法,具体看代码

    /**
     * @author fanshanchao
     * @date 2019/4/17 22:05
     * 定义一个java程序员装饰类 增强了之前的敲代码方法
     *
     */
    public class ProgrammerDecorator implements Programmer {
        private Programmer programmer;
        public ProgrammerDecorator(Programmer programmer){
            this.programmer = programmer;
        }
        @Override
        public void code() {
            wig();
            programmer.code();
        }
        /**
         * 戴假发方法
         */
        private void wig(){
            System.out.println("戴上新买的假发");
        }
    }

    现在看下使用了装饰模式的效果

    运行代码:

    public static void main(String[] args) {
        //新建一个java程序员对象
        Programmer javaProgrammer = new JavaProgrammer();
        //通过装饰类去增强一下程序员对象
        Programmer descProgrammer = new ProgrammerDecorator(javaProgrammer);
        //程序员执行敲代码动作
        descProgrammer.code();
    }

    运行结果:

    c226cbe6beb84dfd4e47d510db7caec7.png

    装饰模式的UML图

    ab300c55fa99da782191063edc0d356e.png

    代理模式

    代理模式就是为其他对象提供一种代理以控制对这个对象的访问。

    用代码继续讲解这个模式

    还是上面的程序员接口和java程序员实现类,现在由于java程序员已经戴上了假发,工作效率激增,并且可以写出一个很牛逼的软件。现在问题来了,你怎么去把这个软件给推销出去?再厉害的软件没人知道也是个不成功的软件。一般程序员只会写代码不会推销产品,所以现在需要一个销售代理程序员完成推销软件这个工作,而程序员只用关心自己需要做的,继续写好自己代码就行。具体看代码。

    定义一个销售类

    /**
     * @author fanshanchao
     * @date 2019/4/17 22:54
     */
    public class Sales implements Programmer {
        private JavaProgrammer programmer;
        public Sales(){
            this.programmer = new JavaProgrammer();
        }
        @Override
        public void code() {
            programmer.code();
            //写完代码后推销软件
            sale();
        }
        public void sale(){
            System.out.println("推销软件.......");
        }
    }

    运行代码:

    public static void main(String[] args) {
        //创建一个销售代理对象
        Programmer programmer = new Sales();
        programmer.code();
    }

    运行结果:

    7aa15c0e4be539538db476e7111b6fb9.png

    代理模式的UML图

    02d9dd25efe7016a595559906d1f75b8.png

    结论

    现在代理模式和装饰模式的具体效果以及实现已经出来了。看到这里代码理解还是很简单的,但是会发现装饰模式和代理模式是非常相似的,之前我就一直区别不来,其实从UML图也可看出来JavaProgrammer与Sales之前是有个关联关系的。在代理模式中我们增强方法是通过直接使用代理类,实际上我们代理的类对外是隐藏的,只能看到代理类。而装饰模式是通过自己传入需要被装饰的对象,然后再使用装饰过后的对象的增强方法。(两者都是对类的方法进行增强,但装饰器模式强调的是增强自身,在被装饰之后你能够够在被增强的类上使用增强后的方法。增强过后还是你,只不过能力变强了。而代理模式则强调要别人帮你去做一些本身与你业务没有太多关系的职责。代理模式是为了实现对象的控制,因为被代理的对象往往难以直接获得或者是其内部不想暴露出来。)括号里这段解释是看到知乎上一位大佬的回答,感觉讲的很好。

    在我们实际业务中装饰模式使用的案例就是IO类,经常可以看到一个流包装之后再包装。而代理模式的使用就有Spring AOP和Spring 事务。不过它们使用的是动态代理。因为普通的代理例如上面的例子称为静态代理,只能代理某一类对象,但在我们实际业务中不可能为每个类都去写一个代理类,所以这个时候就出现了动态代理。动态代理是使用反射的方法实现的,只用传入类的类型就可以达到增强类的方法。关于动态代理的使用有时间再复习一下吧.......

    展开全文
  • 代理和装饰做法是一样。 只是对同一种做法不同侧重点进行定义。 装饰一般用于继承解耦,会增加一些新方法,作为装饰方法。 代理则不增加新方法,会在被代理对象行为前后加点料。代理上网就是一个典型,在...

    代理和装饰做法是一样的。
    只是对同一种做法的不同侧重点进行定义。

    装饰一般用于继承的解耦,会增加一些新的方法,作为装饰方法。

    代理则不增加新方法,会在被代理对象的行为前后加点料。代理上网就是一个典型,在上网前后加了点操作

    个人见解仅供参考

    转载于:https://www.cnblogs.com/flying607/p/9415855.html

    展开全文
  • 代理模式和装饰器模式很像,这里用【到咖啡馆喝咖啡】作例子来讲解。 基础实现 定义一个咖啡接口。 public interface Coffee { /** * 打印当前咖啡里有什么 */ void printMaterial(); } 定义一个苦...
  • 最近上javaeye,看到不少人讨论java设计模式,本人只略熟悉几种常用的设计模式,看到有人讨论代理模式和装饰模式的区别,步骤是 (poxy代理模式) 1。定义一个接口 2。业务类实现接口 3。定义一个poxy类控制访问...
  •  先来看看装饰模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。 代理模式模式的定义:对其他对象进行代理,以控制对被...
  • 今天面试聊到了模式。 面试官问:装饰者模式了解吗,讲一下? 我:blabla... 面试官:那代理模式呢?...代理模式是一项基本设计技巧,许多其他模式,如状态模式、策略模式、访问者模式本质上也...
  • 静态代理和装饰模式的区别

    千次阅读 2018-05-22 22:40:44
    截取一篇文章里总结:代理模式主要是控制对某个特定对象访问,而装饰模式主要是为了给对象添加行为代理模式定义一个测试接口,里面定义一个测试用例执行方法interface ITest{ void execute();}定义一个测试用例...
  • 定义代理模式:为其他对象提供一种代理...代理模式主要是为了控制对象访问(比如权限校验)或者为了更方便访问对象(比如Binder中代理使得跨进程调用方法就像调用本地方法一样) 装饰模式是为了增加新功...
  • 在典型的例子上,两者是非常好区分的。...两个模式的UML类图基本没区别,都是实现同一个接口,一个类包装另一个类。  两者的定义  装饰器模式:能动态的新增或组合对象的行为。  代理模式:为其他
  • 概念:装饰模式就是给一个对象动态增加一些功能,要求装饰对象装饰对象实现同一个接口,装饰对象持有被装饰对象实例。 类结构图: 代码理解: 1.先定义一个抽象接口Sourceable package ...
  • 举个例子,现在书城卖道德经书,有线装版,有精装版,有日文版,有英文版,其中线装版精装版就是装饰模式,日文版英文版就是适配器模式,各种版本都是为迎合不同消费者不同需求。为什么...
  • 设计模式之代理模式和装饰模式的理解代理模式Proxy装饰模式Decorator相同不同使用参考 代理模式Proxy 定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标...
  • 装饰模式和动态代理模式乍一看差不多,都是动态增加行为,其实有各自的区别。 一、首先我们看一下装饰设计模式,其基本思想如下: 1、编写一个类,实现与被装饰类相同接口。目的使他们有相同行为 2、定义一...
  • 装饰和代理的区别

    2016-05-05 21:37:00
    装饰是在原有类上增加功能用 代理是对原有...好,我们把她死党作为这个美女代理,开始时候我们当然要代理打交道了,我们用代理模式实现以下。定义一个接口,这个借口有一个behavior()方法。 1.publicin...
  • 代理模式代理模式在不改变原始类接口条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大不同。 装饰器模式:装饰者模式在不改变原始类接口情况下,对原始类功能...
  • 静态代理和装饰者模式的区别:  先来看一下装饰者模式的定义:装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。  总结一下采用装饰者模式是为了增强或拓展原对象的...
  • 门面模式定义:门面模式(Facade Pattern)又叫外观模式,提供了一个统一接口,用来访问子系统中一群接口,其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构模式。比如通常app首页展示,涉及到多...
  • 代理模式 在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。 代理模式的原理与实现 在不改变原始类(或叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,...
  • 适配器模式的原理与实现 适配器模式的英文翻译是 Adapter Design Pattern。它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。 适配器模式有两种实现方式:类适配器对象...
  • 装饰器这个设计模式也是和静态代理极其相似,也和适配器模式极其相似,下面列出了装饰模式和适配器模式的区别装饰器模式 适配器模式 形式 是一种非常特别的装饰器模式 没有层级关系,...
  • 代理模式

    2017-01-16 15:31:35
    代理模式解析:- 代理模式和装饰模式的区别:两者目的不同,装饰者为对象增加行为,而代理是控制对象的访问。- 代理和适配器模式的区别:代理和适配器都是挡在其他对象的前面,并负责将请求转发给它们。适配器会改变...
  • 1、掌握门面模式和装饰模式的特征和应用场景 2、理解装饰器模式和代理模式的根本区别。 3、了解门面模式的优、缺点。 4、了解装饰器模式的优、缺点。 8.2.内容定位 1、定位高级课程,不太适合接触业务场景比较单一...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

代理模式和装饰模式的定义和区别