适配器模式(连接):允许因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

装饰器模式(增强):原有的不能满足现有的需求,对原有的进行增强。

代理模式(限制):同一个类而去调用另一个类的方法,不对这个方法进行直接操作。

这里,我们用一个狼外婆的故事:一只狼假装成狼外婆,最后失败的故事,来讲解着三种的联系

故事1:狼要假装成外婆,所以,需要穿上人的衣服

public  interface HighAnimal {void highAnimal(String body, String think, String clothes);
}

public class HighAnimalImpl implements HighAnimal {@Overridepublic void highAnimal(String body, String think, String clothes) {System.out.println("这只动物具有"+body+"、"+think+"、"+clothes+",从外形上看,这是个人类。");}
}

public  interface LowAnimal {void lowAnimal(String body);
}

public class LowAnimalImpl implements LowAnimal {@Overridepublic void lowAnimal(String body) {System.out.println("这只动物具有"+body+",从外形上看,这是个动物。");}
}

适配器模式:狼开始穿人的衣服,假装人类

public class Wolf1 implements LowAnimal {HighAnimal highAnimal;public Wolf1(){highAnimal = new HighAnimalImpl();}@Overridepublic void lowAnimal(String body) {highAnimal.highAnimal(body, "伪装的思维", "伪装的衣服");}
}

验证:

public class Story1 {public static void main(String[] args) {LowAnimal wolf = new Wolf1();wolf.lowAnimal("狼的身体");}
}

结果(控制台输出如下):

这只动物具有狼的身体、伪装的思维、伪装的衣服,从外形上看,这是个人类。

故事2:穿上衣服还不够,还需要能说会骗,要不然怎么让小红帽开门

装饰模式:对行为进行扩展,让狼说话

public class Wolf2 implements LowAnimal {LowAnimal lowAnimal;public Wolf2(Wolf1 wolf1){this.lowAnimal = wolf1;}@Overridepublic void lowAnimal(String body) {lowAnimal.lowAnimal(body);System.out.println("Ta学习了说话!");}
}

验证:

public class Story2 {public static void main(String[] args) {LowAnimal wolf = new Wolf2(new Wolf1());wolf.lowAnimal("狼的身体");}
}

控制台输出:

这只动物具有狼的身体、伪装的思维、伪装的衣服,从外形上看,这是个人类。
Ta学习了说话!

故事3:因为自新中国成立以来,就不许动物成精了,所以,在入口的时候,加以控制,狼虽然学了说话,但是,还是死在了新中国的关辉中

代理模式:为其他对象提供一种代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

public class Wolf3 implements LowAnimal {LowAnimal lowAnimal;public Wolf3(){lowAnimal = new  Wolf2(new Wolf1());}@Overridepublic void lowAnimal(String body) {if(body.contains("狼")){lowAnimal.lowAnimal(body);System.out.println("自新中国成立以来,就不许动物成精了!!!所以,狼死在了党的光辉中");}else{System.out.println("通过了代理的验证!");}}
}

验证:

public class Story3 {public static void main(String[] args) {LowAnimal wolf = new Wolf3();wolf.lowAnimal("狼的身体");}
}

控制台输出:

这只动物具有狼的身体、伪装的思维、伪装的衣服,从外形上看,这是个人类。
Ta学习了说话!
自新中国成立以来,就不许动物成精了!!!所以,狼死在了党的光辉中

装饰模式 VS 代理模式

  装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。
  换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
        另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。

转载于:https://www.cnblogs.com/sg9527/p/7774246.html

适配器模式 VS 装饰模式 VS 代理模式 一个狼外婆的故事串联起来相关推荐

  1. 对设计模式的总结之装饰模式与代理模式

    前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...

  2. 装饰模式与代理模式的区别

    http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html 学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是 ...

  3. 我与代理模式不得不说的故事

    简介:代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 把代理模式归为三类角色 ...

  4. C++设计模式::装饰模式or代理模式or面向切片编程(AOP)

    一个实例 装饰模式:动态地给一个对象(而非一个类)添加一些额外的职责.就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂件.屏 ...

  5. 带你认识4种设计模式:代理模式、装饰模式、外观模式和享元模式

    摘要:本文我们主要介绍结构型模式中的代理模式.装饰模式.外观模式和享元模式. 本文分享自华为云社区<快来,这里有23种设计模式的Go语言实现(三)>,原文作者:元闰子 . 设计模式(Des ...

  6. 设计模式——代理模式与装饰模式的异同

    两种模式的特点 装饰模式: 在不改变接口的前提下,动态扩展对象的访问. 动态继承,让类具有在运行期改变行为的能力. 装饰模式,突出的是运行期增加行为,这和继承是不同的,继承是在编译期增加行为. 强调: ...

  7. JAVA设计模式理解与总结(下)代理模式适配器模式观察者模式

    码了好几年代码的打字机器我,对于设计模式这个词,肯定是一点也不陌生,但是对于设计模式的理解,因为日常开发中,增删改查较多,使用设计模式思想来优化代码的机会就很少.也不乏在翻阅源码的时候,叹服于别人优秀 ...

  8. 安卓适配器类中怎么调用intent_设计模式:代理模式/中介者模式 / 桥接模式/适配器 - 七星望...

    模式某种角度上来讲就是对象组合.不要看他们都是对象组合就好像是一样的.模式的动机,意图,使用场合,组合方式,这些都是模式的一部分.其中细微的不同足以区分不同的模式. 行为模式的主要特点就是处理的是对象 ...

  9. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

最新文章

  1. 怎么选?阿里P7 or 副处级干部?
  2. STM32F103的11个定时器详解
  3. 使用VNC远程连接阿里云ECS实例的Ubuntu系统
  4. react-native填坑--react-navigation
  5. Redis在windows下的配置
  6. linux系统之间无密传输,scp采用无密码在两台linux服务器之间传输数据(示例代码)...
  7. php 中文拼音,php中文转拼音
  8. TensorFlow 教程 --进阶指南--3.6增加一个新 Op
  9. 薇娅直播卖火箭,B 站酒泉发卫星,航天贴标生意凭什么?
  10. 高中数学解析几何解题方法,2019高考生没有掌握方法!
  11. ValueError: Wrong number of items passed 2, placement implies 1
  12. 如何从课堂派上扒取直播视频
  13. 学日语就是一种煎熬!
  14. iOS:图片的旋转方向问题
  15. 平均年薪50.8万,数据人拿下这个证书有多香?!
  16. 万字长文!Unix 和 Linux 你不知道的那些历史(详解版)
  17. 一个字等于几个字节,怎么确定机器是16/32/64位机器
  18. Python处理Excel(6):处理清产核资表格(1)
  19. 阿里最受追捧的「中高级技术核心」,助我拿下菜网offer,附面经
  20. 数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据,解决图片恢复后打不开的问题

热门文章

  1. Linux之内存泄露的检测工具
  2. 基于FPGA用VerilogHDL设计实现DDS直接频率合成的详细步骤(QuartusII调用ModelSim进行仿真详细步骤)
  3. http协议修改js或html,web前端面试题对答篇:HTTP fetch发送2次请求的原因?
  4. URL输入到页面加载解析发生了什么?
  5. java中打开文件怎么实现_Java如何在程序中打开文件?
  6. 电子教室的原理及如何使用
  7. 彻底关闭苹果系统更新_iOS13.2系统彻底关闭,杀后台问题终于被埋进坟墓
  8. Rocket MQ详解
  9. Excel快速选中某一列的所有数
  10. SV学习小记(3) class