设计模式: Decorator 装饰者(java)

来源:互联网 发布:光伏数据采集器品牌 编辑:程序博客网 时间:2024/05/01 00:15

1.动机

    1)想为component丰富功能,但又不想创建component的子类

    2)只需要丰富对象的功能,而不是类


2.实现

    继承基类或者抽象类

    将抽象类对象作为自己的成员变量,并实现基类或者抽象类的方法(装饰器)

    其他类继承该装饰器,并丰富相应的功能。

   


2.与strategy策略模式对比

    策略模式是将接口或对象作为参数传到类里,该类调用参数的方法。相当于改变类的内核,并且不依赖于该类;

    装饰者模式是聚合该类,并添加方法。相当于给类装了个外壳,依赖于该类,所以该类不能太大。


3.实现

//: generics/decorator/Decoration.javapackage generics.decorator;import java.util.*;//基类class Basic {  private String value;  public void set(String val) { value = val; }  public String get() { return value; }}//继承基类,聚合基类对象并并实现基类方法class Decorator extends Basic {  protected Basic basic;  //聚合基类对象  public Decorator(Basic basic) { this.basic = basic; }  public void set(String val) { basic.set(val); }  public String get() { return basic.get(); }}//继承装饰器并丰富功能class TimeStamped extends Decorator {  private final long timeStamp;  public TimeStamped(Basic basic) {    super(basic);    timeStamp = new Date().getTime();  }  public long getStamp() { return timeStamp; }}class SerialNumbered extends Decorator {  private static long counter = 1;  private final long serialNumber = counter++;  public SerialNumbered(Basic basic) { super(basic); }  public long getSerialNumber() { return serialNumber; }}public class Decoration {  public static void main(String[] args) {    TimeStamped t = new TimeStamped(new Basic());    TimeStamped t2 = new TimeStamped(      new SerialNumbered(new Basic()));    //! t2.getSerialNumber(); // Not available    SerialNumbered s = new SerialNumbered(new Basic());    SerialNumbered s2 = new SerialNumbered(      new TimeStamped(new Basic()));    //! s2.getStamp(); // Not available  }} ///:~


0 0
原创粉丝点击