全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java设计模式之代理模式与装饰模式实例详解

本文实例讲述了Java设计模式之代理模式与装饰模式。分享给大家供大家参考,具体如下:

之所以把这两种模式放在一起说,是因为我发现这了两种模式几乎一模一样!

从网上也搜了一些资料,发现两者还是有一些区别的。我们在学习的同时也把这种困惑搞清楚。

定义:

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

装饰模式,动态地给一个对象添加一些额外的职责。

代理模式,很好理解,就是把一个对象再次封装,以后就对封装的对象访问就可以了。

因为代理对象已经取代了被代理对象。

装饰模式,给一个对象增加功能,形象一点就是做为一个服务生站在一边提供服务。

所以根本的区别是,装饰模式对象还在场,不是取代原对象,而是在一边提供服务。

本文所阐述观点均为个人理解,只对本人负责。

下面给出例子:

package test.design.proxydecorator;
/**
 * 接口定义行为:吃饭
 * @author lushuaiyin
 *
 */
public interface Eatable {
  void eatFood();
}

package test.design.proxydecorator;
/**
 * 实现类
 * @author lushuaiyin
 *
 */
public class Man implements Eatable{
  @Override
  public void eatFood() {
    System.out.println("I am eating food! Happy!");
  }
}

以上是普通的接口与实现,下面是模式实例

代理模式

package test.design.proxydecorator;
/**
 * 代理模式
 * 代理对象把被代理对象封装,像一个包装盒把被代理对象包裹起来。
 * 它不改变被代理对象的原有逻辑,只是增加来了一些自己的服务,像一个代理一样。
 * 代理从使用上给调用者的感觉就是你已经取代了原来的对象。
 * 就像皇太后取代小皇帝实行垂帘听政。
 * @author Administrator
 *
 */
public class ProxyMan implements Eatable{
  private Eatable eatable;
  public ProxyMan(){
    System.out.println("proxy: I am proxy object. I will help you create a object of Man that wnt to be proxyed");
    this.eatable=new Man();
    //注意代理对象把被代理对象封装,在内部有实际的被代理对象,这个调用者是不知道的。
  }
  @Override
  public void eatFood() {
    //代理对象把被代理对象的功能封装,蛋不改变其内部逻辑,只是增加一些服务。
    System.out.println("proxy: I know you are hungry,so I cook for you some food.");
    this.eatable.eatFood();
    System.out.println("proxy: Now you eat up food. Let me help you clean the dishes.");
  }
}

装饰模式

package test.design.proxydecorator;
/**
 * 装饰的抽象.
 * 也可以不用抽象类,简单的父类也可以,只要实现装饰功能.
 * 抽象只是为了增加一层封装,规定装饰者必有的装饰功能而已。
 * @author lushuaiyin
 *
 */
public abstract class DecoratorMan {
  protected Eatable eatable;
  //使用构造函数或者set方法(或其他方法)把接口对象传入。
  //注意,必须保证这个对象的传入,最好还是用构造函数。
  public DecoratorMan(Eatable eatable){
    this.eatable=eatable;
  }
  public void eatFood(){
    this.eatable.eatFood();
  };
}

package test.design.proxydecorator;
/**
 * 装饰模式
 * 装饰对象时独立于原来的对象的。它和被装饰的对象有关系,但是是独立的对象。
 * 装饰对象更像一个酒店服务生,为别人提供服务,所以他还是他自己,他有自己的实际存在。
 * @author lushuaiyin
 *
 */
public class Decorator extends DecoratorMan{
  public Decorator(Eatable eatable) {
    super(eatable);
  }
  //重写父类方法
  public void eatFood(){
    decoratorServiceCookFood();//装饰的具体行为
    super.eatable.eatFood();
    decoratorServiceCleanDishes();//装饰的具体行为
  };
  public void decoratorServiceCookFood(){
    System.out.println("Decorator: I know you are hungry,so I cook for you some food.");
  }
  public void decoratorServiceCleanDishes(){
    System.out.println("Decorator: Now you eat up food. Let me help you clean the dishes.");
  }
}

最关键的是调用,这也是这两种模式的主要区别所在!

package test.design.proxydecorator;
public class TestMain {
  /**
   * @param args
   */
  public static void main(String[] args) {
    //代理模式
    System.out.println("代理模式:");
    Man m1=new Man();//通常情况下
    m1.eatFood();
    System.out.println("---------------------------");
    //代理模式者直接取代某对象,你连你想要见的人的面都见不到。
    //它说你要见的人已经把所有事委托于我,他会的我会;他不会的,我也会。我就是他的替代增强版。
    Eatable e1=new ProxyMan();
    e1.eatFood();
    System.out.println("------------分割---------------");
    System.out.println("装饰模式:");
    Man m2=new Man();//通常情况下
    m2.eatFood();
    System.out.println("---------------------------");
    //装饰模式者站在一边提供各种服务.
    //装饰者和被装饰者都在场,装饰者提供服务,赚取小费。
    Decorator d1=new Decorator(m2);
    d1.eatFood();
  }
}

打印:

代理模式:
I am eating food! Happy!
---------------------------
proxy: I am proxy object. I will help you create a object of Man that wnt to be proxyed
proxy: I know you are hungry,so I cook for you some food.
I am eating food! Happy!
proxy: Now you eat up food. Let me help you clean the dishes.
------------分割---------------
装饰模式:
I am eating food! Happy!
---------------------------
Decorator: I know you are hungry,so I cook for you some food.
I am eating food! Happy!
Decorator: Now you eat up food. Let me help you clean the dishes.

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


# Java  # 设计模式  # 代理模式  # 装饰模式  # 详解Java设计模式中的装饰模式  # 深入理解Java设计模式之装饰模式  # Java通俗易懂系列设计模式之装饰模式  # java设计模式笔记之装饰模式  # Java设计模式之装饰模式原理与用法实例详解  # java设计模式学习之装饰模式  # java设计模式之装饰模式详细介绍  # Java设计模式之装饰模式详解  # 自己的  # 的人  # 站在  # 这两种  # 要见  # 的是  # 情况下  # 操作技巧  # 垂帘听政  # 来了  # 很好  # 是因为  # 我会  # 就像  # 相关内容  # 是他  # 调用者  # 两种  # 他还  # 均为 


相关文章: 青岛网站建设如何选择本地服务器?  5种Android数据存储方式汇总  香港服务器部署网站为何提示未备案?  如何确保FTP站点访问权限与数据传输安全?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何快速搭建虚拟主机网站?新手必看指南  如何实现建站之星域名转发设置?  高端建站三要素:定制模板、企业官网与响应式设计优化  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何获取PHP WAP自助建站系统源码?  如何快速生成可下载的建站源码工具?  如何选择靠谱的建站公司加盟品牌?  建站org新手必看:2024最新搭建流程与模板选择技巧  如何在腾讯云免费申请建站?  如何快速重置建站主机并恢复默认配置?  无锡营销型网站制作公司,无锡网选车牌流程?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何用虚拟主机快速搭建网站?详细步骤解析  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  建站之星logo尺寸如何设置最合适?  临沂网站制作企业,临沂第三中学官方网站?  如何在Windows 2008云服务器安全搭建网站?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  C#怎么使用委托和事件 C# delegate与event编程方法  如何快速搭建响应式可视化网站?  专业网站建设制作报价,网页设计制作要考什么证?  建站之星官网登录失败?如何快速解决?  北京网站制作的公司有哪些,北京白云观官方网站?  怀化网站制作公司,怀化新生儿上户网上办理流程?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何用VPS主机快速搭建个人网站?  如何在阿里云服务器自主搭建网站?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  网站制作壁纸教程视频,电脑壁纸网站?  实例解析Array和String方法  如何基于PHP生成高效IDC网络公司建站源码?  建站主机系统SEO优化与智能配置核心关键词操作指南  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何在IIS7中新建站点?详细步骤解析  如何选择CMS系统实现快速建站与SEO优化?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何配置支付宝与微信支付功能?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  建站之星在线版空间:自助建站+智能模板一键生成方案  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  如何快速生成ASP一键建站模板并优化安全性?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  长沙企业网站制作哪家好,长沙水业集团官方网站?  网站企业制作流程,用什么语言做企业网站比较好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。