/**
* 书本:《Thinking In Java》
* 功能:装饰器设计模式
* 装饰器模式使用分层对象来动态透明的向单个对象添加责任。装饰器指定包装在最初的对象周围的所有对象都具有相同的基本接口
* 某些事物是可装饰的,可以通过将其他类包装在这个可装饰对象的四周,来将功能分层。
* 装饰器是通过使用组合和形式化结构(可装饰物/装饰器层次结构)来实现的,而混型是基于继承的
* 文件:Decoration.java
* 时间:2015年4月21日10:18:43
* 作者:cutter_point
*/
package Lesson15_generices.decorator;
import java.util.Date;
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) { this.basic.set(val); } //传的参数是Basic,但是里面用的value还是从Basic继承来的
public String get() { return this.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(); //是错的,无法调用这个函数,就算后面创建的是SerialNumbered这个参数
System.out.println(t.getStamp()+" "+t2.getStamp());
SerialNumbered s = new SerialNumbered(new Basic());
SerialNumbered s2 = new SerialNumbered(new TimeStamped(new Basic()));
System.out.println(s.getSerialNumber()+" "+s2.getSerialNumber());
// s2.getStamp(); //无法调用
}
}
输出:
1431994101438 1431994101438
2 3