装饰者模式目标

把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活

装饰者模式角色

  • 抽象组件角色

给出一个抽象接口

  • 具体组件角色

定义一个将要增加附加功能的类,相当于父类

  • 抽象装饰者角色

持有一个组件对象的实例,并且实现抽象组件接口

  • 具体装饰者角色

负责给组件对象添加附加的功能,相当于子类

装饰者模式示例

以一件商品被卖出为例

//抽象组件角色 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 装饰者模式与继承的区别的更多相关文章

  1. java装饰者模式理解

    java 装饰者模式其实就是扩展子类的功能,和继承是一个性质. 但继承是在编译时就固定扩展了父类的一些功能,而装饰者模式是在运行过程中动态绑定对象,实现一个子类可以随时扩展功能. 将方法排列组合,也可 ...

  2. Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别

    IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...

  3. Java 装饰器模式详解

    转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了Java 中常见的 IO 相关知 ...

  4. Java装饰者模式(Decorator)

    一.定义 装饰模式的设计理念主要是以对客户端透明的方式动态扩展对象的功能,是继承关系的一个替代(继承会产生大量的子类,而且代码有冗余).装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展.装饰 ...

  5. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

  6. JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  7. java 装饰者模式

    一.概念 我们在使用以前既定的类或者使用别人使用的类的时候,如果该类的方法,不满足你的需求的时候,需要你进行额外附加功能的时候,往往我们想到的方法是继承实现, 但是继承会导致类的越来越庞大,有什么好的 ...

  8. Java装饰者模式(思维导图)

    图1 装饰者模式[点击查看图片] 1,一个简单的以人为主体的装饰者模式 被装饰者 public interface Human {//被装饰者 public void wearClothes(); p ...

  9. java 装饰器模式实现代码

    目录 1.实现装饰器模式 1.1.公共接口 1.2.接口实现 1.3.装饰器 1.4.装饰构件 1.5.测试装饰器 上图展示的是io流中的一个装饰者模式的代码结构 1.实现装饰器模式 汽车厂生产汽车实 ...

随机推荐

  1. 另类的SQL注入方法

    前言:相比基于查询的SQL注入,使用insert.update和delete进行SQL注入显得略显另类 参考自:http://www.exploit-db.com/wp-content/themes/ ...

  2. android常犯错误记录

    错误:Error:Error: Found item Attr/border_width more than one time 这个容易,属性相同了,按照提示查询一下找出来删了就行了,注意大小写很容易 ...

  3. iOS 疑难杂症 — — UITableView 添加 tableFooterView 旋转屏幕后收不到点击事件!!!

    声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 新手的烦恼你不懂 - - ## ...

  4. setOnLongClickListener中return值

    今天在做一个按钮的长按事件,长按的时候弹出一个Dialog弹出框,点击则是进入到下一个界面. 在我调试的时候,发现长按确实弹出了一个Dialog,但是同事他还跳转到下一个界面了. 这么说,就是在我长按 ...

  5. AjaxHelper简介

    在Asp.Net MVC中提供了AjaxHelper类: Ajax.ActionLink 创建一个超链接,点击时,使用Ajax提交数据到一个指定的控制器 Ajax.RouteLink 和ActionL ...

  6. Linux 克隆虚拟机引起的“Device eth0 does not seem to be present, delaying initialization”

    虚拟机Vmware上克隆了一个Red Hat Enterprise Linx启动时发现找不到网卡,如下所示,如果你在命令窗口启动网络服务就会遇到"Device eth0 does not s ...

  7. Android:使用代理服务器安装SDKs

    在使用Android SDK Manager来安装SDK时,因为google的ip被墙了,所以下载文件时,下载不到. 面对不能访问google的问题,通常有下列方案: 1)修改hosts文件,需要有正 ...

  8. Echarts 之二——地市联动数据统计

    一.简介 通过地图可以更直观地展示各个地区的统计数据,能够更清楚地进行数据分析.有些场景下,我们不仅仅需要对每个地市进行统计分析.更需要对地市一下的区县进行数据统计,并进行联动.此事我们可以通过Ech ...

  9. uboot命令一览

    ? - alias for 'help' base - print or set address offset bdinfo - print Board Info structure boot - b ...

  10. php应用jquery做ajax操作

    以下是全部代码: <html> <head> <title>jQuery Ajax 实例演示</title> </head> <scr ...