本文实例讲述了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小时内与您取得联系。