Decorator模式中遭遇继承与聚合的冲突
时间:2010-12-23
一:背景:Decorator
*Decorator 常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator 模式中是必须的。
*Decorator 定义:
动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator 模式相比用生成子类方式达到功能的扩充显得更为灵活。
*为什么使用Decorator?
我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。
使用Decorator 的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator 提供了"即插即用"的方法,在运行期间决定何时增加何种功能。
*对于该模式,初步归纳为
1.基本功能为接口
2.Decorator参数为接口本身也为接口以便为下一个Decorator的参数
3.基本功能类实现接口 并作为Decorator构造函数的参数,以便在此基础上添加新功能
4.额外功能由Decorator中的数据结构处理
二:问题
这是一段Decorator设计模式的实现例子如下:
基本功能:Counter类
需要添加的功能
1:上限控制
Decorator模式中遭遇继承与聚合的冲突(2)
时间:2010-12-23
2:下限控制
import java.io.*;
class Counter{
private int value;
public Counter(int v){
System.out.println("init me here in The Counter with value!");
value=v;
}
public Counter(Counter cc){
System.out.println("init me here in The Counter with class!");
value=cc.value;
}
public int read_value(){
System.out.println("read me here The value is:"+value);
System.out.println("read me here in The Counter!");
return value;
}
public void increment(){
System.out.println("increment me here in The Counter !");
value++;
}
public void decrement(){
System.out.println("decrement me here in The Counter !");
value--;
}
}
class Decorator extends Counter
{
Counter counter;
public Decorator(Counter c)
{
super(c);
System.out.println("init me here with class Decorator!");
}
}
class UpperLimit extends Decorator//上限控制
{
public UpperLimit(Counter c)
{
super(c);
counter=c;
System.out.println("init me here with class UpperLimit!");
}
public void increment()
{
if(counter.read_value()>20)
{
System.out.println("Too High");
}
else
{
System.out.println("increment me here with class UpperLimit!");
counter.increment();
}
}
/*public void decrement()
{
counter.decrement();
}
public int read_value()
{
return counter.read_value();
}*/
}
class LowerLimit extends Decorator//下限控制
{
public LowerLimit(Counter c)
{
super(c);
counter=c;
System.out.println("init me here in The Counter with class LowerLimit!");
}
public void decrement()
{
System.out.println("Class value :"+read_value());
System.out.println("Dec value :"+counter.read_value());
if(counter.read_value()<=0)
{
System.out.println(counter.read_value());
System.out.println("Too Low");
}
else
{
System.out.println("decrement me here in The Co
|