java 装饰者模式与继承的区别
装饰者模式目标
把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活
装饰者模式角色
- 抽象组件角色
给出一个抽象接口
- 具体组件角色
定义一个将要增加附加功能的类,相当于父类
- 抽象装饰者角色
持有一个组件对象的实例,并且实现抽象组件接口
- 具体装饰者角色
负责给组件对象添加附加的功能,相当于子类
装饰者模式示例
以一件商品被卖出为例
//抽象组件角色 Commodity.java
public interface Commodity { public void beSoldOut();
} //具体组件角色 public class Book implements Commodity { @Override
public void beSoldOut() {
System.out.println("书被卖出去了");
}
} //抽象装饰者角色
//实现了抽象组件接口
public abstract class Decorator implements Commodity { Commodity commodity; //持有组件对象的实例 Decorator(Commodity commodity){
this.commodity=commodity;
}
@Override
public void beSoldOut() {
commodity.beSoldOut();
} } //具体装饰者角色:增加了折扣的功能 public class DiscountDecorator extends Decorator { public DiscountDecorator(Commodity commodity) {
super(commodity);
} public void discount(){
System.out.println("再送一件相同的商品");
}
@Override
public void beSoldOut() {
// TODO Auto-generated method stub
super.beSoldOut();
discount();
} } //具体装饰者角色:再次折扣促销 public class DiscountAgainDecorator extends Decorator { public DiscountAgainDecorator(Commodity commodity){
super(commodity);
} public void discountAgain(){
System.out.println("再送一件价格低一点的商品");
} @Override
public void beSoldOut() {
super.beSoldOut();
discountAgain();
}
} //客户端测试类 testDecorator.java public class testDecorator { public void static main(String[] args) {
Commodity book = new Book();
Decorator decorator = new DiscountAgainDecorator(new DiscountDecorator(book));
decorator.beSoldOut();
}
}
代码运行结果为:
|
装饰者模式和继承的区别 继承实现的增强类: 装饰模式实现的增强类: |
java 装饰者模式与继承的区别的更多相关文章
- java装饰者模式理解
java 装饰者模式其实就是扩展子类的功能,和继承是一个性质. 但继承是在编译时就固定扩展了父类的一些功能,而装饰者模式是在运行过程中动态绑定对象,实现一个子类可以随时扩展功能. 将方法排列组合,也可 ...
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...
- Java 装饰器模式详解
转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了Java 中常见的 IO 相关知 ...
- Java装饰者模式(Decorator)
一.定义 装饰模式的设计理念主要是以对客户端透明的方式动态扩展对象的功能,是继承关系的一个替代(继承会产生大量的子类,而且代码有冗余).装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展.装饰 ...
- JAVA装饰者模式(从现实生活角度理解代码原理)
装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...
- JAVA装饰器模式
Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...
- java 装饰者模式
一.概念 我们在使用以前既定的类或者使用别人使用的类的时候,如果该类的方法,不满足你的需求的时候,需要你进行额外附加功能的时候,往往我们想到的方法是继承实现, 但是继承会导致类的越来越庞大,有什么好的 ...
- Java装饰者模式(思维导图)
图1 装饰者模式[点击查看图片] 1,一个简单的以人为主体的装饰者模式 被装饰者 public interface Human {//被装饰者 public void wearClothes(); p ...
- java 装饰器模式实现代码
目录 1.实现装饰器模式 1.1.公共接口 1.2.接口实现 1.3.装饰器 1.4.装饰构件 1.5.测试装饰器 上图展示的是io流中的一个装饰者模式的代码结构 1.实现装饰器模式 汽车厂生产汽车实 ...
随机推荐
- SharePoint 2013 Excel Services ECMAScript 示例之明日限行
前言:最近遇到一个“明日限行”的功能,北京的交通啊,这个不在今天讨论范围内,暂不吐槽,想想代码开发,还要写WebPart部署,很麻烦,而且部署服务器,需要领导审批,想绕过这个麻烦事儿,就想到客户端了, ...
- 自定义AlertDialog控件的使用(AndroidStudio)
AlertDialog 第一种:可随意自定义控件 第一步:自定义弹出的页面 ,新建一个XML页面 如下图 不需要Activity 第二步:在主页面设置一个按钮弹出上图页面 (下面是主要代码 调用 ...
- iOS程序破解——class-dump获取头文件
原文在此:http://www.cnblogs.com/mddblog/p/4942894.html 一.简述 class-dump顾名思义,是用来dump目标对象class信息的工具.它根据oc的r ...
- css sprite 调整大张图片中小图标的大小
直接说解决方法: 假设一张拼合好的大图大小是:900 x 1000 px (如上图) 现在想取图中左上角的河马图标,并缩小图标的大小. 正常取图: .sprite { background: url( ...
- ORACLE等待事件: log file parallel write
log file parallel write概念介绍 log file parallel write 事件是LGWR进程专属的等待事件,发生在LGWR将日志缓冲区(log_buffer)中的重做日志 ...
- angularJS操作键值对象(类似java的hashmap)填坑小结
前言: 我们知道java的hashmap中使用最多的是put(...),get(...)以及remove()方法,那么在angularJS中如何创造(使用)这样一个对象呢 思路分析: 我们知道在jav ...
- MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象
回到目录 对于MongoDB的封装还在继续,对于不断追求简单的编程还在继续,对于喜欢代码的那么感觉,还在继续... 当你的mongo数据表里有子对象时,尤其是列表对象时,使用官方的驱动很是不爽,要记得 ...
- 使用JNI封装底层input系统提供的event事件
首先说下思路,本文采用jni技术封装底层触摸事件,封装成MotionEvent类一样,不过没有android系统MotionEvent强大.源码MotionEvent位置:java-->fram ...
- 发现 OpenStack: 架构、功能和交互
原文:http://www.ibm.com/developerworks/cn/cloud/library/cl-openstack-overview/index.html OpenStack 是由 ...
- linux mail利用外部邮箱地址发邮件
mail命令发送邮件需要sendmail或postfix服务 三种常用格式发信 mail -s "标题" xxx@xxx.xxx #第一种方法,你可以把当前shell当成编辑器来用 ...