设为首页收藏本站

ZMX - IT技术交流论坛 - 无限Perfect,追求梦想 - itzmx.com

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

搜索
查看: 1725|回复: 0

设计模式之装饰者模式

[复制链接]

签到天数: 36 天

[LV.5]常住居民I

发表于 2016/12/30 16:44 | 显示全部楼层 |阅读模式 |Google Chrome 45.0.2454.101|Windows 7
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
  装饰者模式目标

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

  装饰者模式角色

  抽象组件角色

  给出一个抽象接口

  具体组件角色

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

  抽象装饰者角色

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

  具体装饰者角色

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

  装饰者模式示例

  以一件商品被卖出为例,

  //抽象组件角色 Commodity.java

  public interface Commodity {

  public void beSoldOut();

  }

  //具体组件角色

  public class Book implements Commodity {

  @Override

  public void beSoldOut() {

  System.out.println("书被卖出去了");

  }

  }

  //抽象装饰者角色 Decorator.java

  //实现了抽象组件接口

  public abstract class Decorator implements Commodity {

  Commodity commodity; //持有组件对象的实例

  Decorator(Commodity commodity){

  this.commodity=commodity;

  }

  @Override

  public void beSoldOut() {

  commodity.beSoldOut();

  }

  }

  //具体装饰者角色:增加了折扣的功能 DiscountDecorator.java

  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();

  }

  }

  //具体装饰者角色:再次折扣促销  DiscountAgainDecorator.java

  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(www.9ask.cn/cz/);

  }

  }
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 新浪微博账号登陆用百度帐号登录

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2024/12/27 13:24 , Processed in 0.090938 second(s), 20 queries , MemCache On.

Powered by itzmx! X3.4

© 2011- sakura

快速回复 返回顶部 返回列表