柠檬墨绿色 发表于 2016/12/30 16:44

设计模式之装饰者模式

  装饰者模式目标

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

  装饰者模式角色

  抽象组件角色

  给出一个抽象接口

  具体组件角色

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

  抽象装饰者角色

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

  具体装饰者角色

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

  装饰者模式示例

  以一件商品被卖出为例,

  //抽象组件角色 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/);

  }

  }
页: [1]
查看完整版本: 设计模式之装饰者模式