《设计模式精解》学习笔记(十一)------Decorator(装饰)模式
2006-12-22 15:40
363 查看
《设计模式精解》学习笔记(十一)------Decorator(装饰)模式
GoF:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator(装饰)模式相比生成子类更为灵活。
在系统开发的过程中,我们希望给某个对象而不是整个类添加一些功能。例如:我们要做一扇门,现在为了能将门做的美观和安全需要给门加上锁和把手,还可能给门加上窗户和雕花。这里我们把这些要添加的东西叫做门的属性。
使用继承机制是添加功能的一种有效途径,从其他类继承过来的属性可以被多个子类的实例所使用。但这种方式不够灵活,因为如果我们的门做工过细价钱也就高,有些顾客可能不需要这样的门。这样我们就需要灵活添加门的属性。
一种较为灵活的方式是使用Decorator模式。Decorator模式的效果是:让我们可以创建以decorator对象—负责新的功能的对象—开始的一条对象“链”,并结束于最初的对象。
Decorator模式帮助我们将问题分解为两个部分:
l 如何实现提供新功能的对象。
l 如何为每种特定情况将对象组织起来。
一个实际的例子是Java的I/O类就广泛使用了Decorator模式,大家有兴趣可以去研究一下。直到现在我还没有研究过。
装饰模式包括如下角色:
l 抽象构件(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
l 具体构件(Concrete Component):定义一个将要接收附加责任的类。
l 装饰(Decorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
l 具体装饰(Concrete Decorator):负责给构件对象“贴上”附加的责任。
下面是Decorator模式的UML图:
下面是事例代码:
package Decorator;
/*
* 定义一个抽象类派生出一个具体门(Door)和一个装饰抽象类(Decorator)
*/
public abstract class Component
{
public abstract void sampleOperation();
}//end abstract class Component
package Decorator;
/*
* 具体的一个门
*/
public class Door extends Component
{
public void sampleOperation()
{
System.out.println("Build a door!");
}//end sampleOperation()
}//end class Door
package Decorator;
/*
* 一个装饰抽象类,下面派生出一个用来装饰门的锁子和一个把手
*/
public abstract class Decorator extends Component
{
private Component component;
public Decorator(Component component)
{
this.component = component;
}//end Decorator
public void sampleOperation()
{
this.component.sampleOperation();
}//end sampleOperation()
}//end abctract class Decorator
package Decorator;
/*
* 用来装饰门的把手
*/
public class Knob extends Decorator
{
public Knob(Component component)
{
super(component);
}//end ConcreteDecorator2(...)
public void sampleOperation()
{
super.sampleOperation ();
System.out.println("Add an Knob(把手)");
}//end sampleOperation()
}//END CLASS Knob
package Decorator;
/*
* 用来装饰门的门锁
*/
public class Lock extends Decorator
{
public Lock(Component component)
{
super(component);
}//end ConcreteDecorator1(...)
public void sampleOperation()
{
super.sampleOperation ();
System.out.println("Add a lock(锁)");
}//end sampleOperation()
}//end class Lock
package Decorator;
public class DecoratorPattern
{
private Component door = new Door();//创建一个扇门(向下转型)
private Component lock = new Lock(door);//添加一把锁(向下转型)
private Component knob = new Knob(lock);//再添加一个把手(向下转型)
public void showDecorator()
{
// door.sampleOperation();
// lock.sampleOperation();
knob.sampleOperation();
}//end showDecorator()
public static void main(String[] args)
{
System.out.println("Decorator Pattern!/n");
DecoratorPattern dp = new DecoratorPattern();
dp.showDecorator();
}//end main(...)
}//end class DecoratorPattern
下面是执行结果:
Decorator Pattern!
Build a door!
Add a lock(锁)
Add an Knob(把手)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=610788
GoF:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator(装饰)模式相比生成子类更为灵活。
在系统开发的过程中,我们希望给某个对象而不是整个类添加一些功能。例如:我们要做一扇门,现在为了能将门做的美观和安全需要给门加上锁和把手,还可能给门加上窗户和雕花。这里我们把这些要添加的东西叫做门的属性。
使用继承机制是添加功能的一种有效途径,从其他类继承过来的属性可以被多个子类的实例所使用。但这种方式不够灵活,因为如果我们的门做工过细价钱也就高,有些顾客可能不需要这样的门。这样我们就需要灵活添加门的属性。
一种较为灵活的方式是使用Decorator模式。Decorator模式的效果是:让我们可以创建以decorator对象—负责新的功能的对象—开始的一条对象“链”,并结束于最初的对象。
Decorator模式帮助我们将问题分解为两个部分:
l 如何实现提供新功能的对象。
l 如何为每种特定情况将对象组织起来。
一个实际的例子是Java的I/O类就广泛使用了Decorator模式,大家有兴趣可以去研究一下。直到现在我还没有研究过。
装饰模式包括如下角色:
l 抽象构件(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
l 具体构件(Concrete Component):定义一个将要接收附加责任的类。
l 装饰(Decorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
l 具体装饰(Concrete Decorator):负责给构件对象“贴上”附加的责任。
下面是Decorator模式的UML图:
下面是事例代码:
package Decorator;
/*
* 定义一个抽象类派生出一个具体门(Door)和一个装饰抽象类(Decorator)
*/
public abstract class Component
{
public abstract void sampleOperation();
}//end abstract class Component
package Decorator;
/*
* 具体的一个门
*/
public class Door extends Component
{
public void sampleOperation()
{
System.out.println("Build a door!");
}//end sampleOperation()
}//end class Door
package Decorator;
/*
* 一个装饰抽象类,下面派生出一个用来装饰门的锁子和一个把手
*/
public abstract class Decorator extends Component
{
private Component component;
public Decorator(Component component)
{
this.component = component;
}//end Decorator
public void sampleOperation()
{
this.component.sampleOperation();
}//end sampleOperation()
}//end abctract class Decorator
package Decorator;
/*
* 用来装饰门的把手
*/
public class Knob extends Decorator
{
public Knob(Component component)
{
super(component);
}//end ConcreteDecorator2(...)
public void sampleOperation()
{
super.sampleOperation ();
System.out.println("Add an Knob(把手)");
}//end sampleOperation()
}//END CLASS Knob
package Decorator;
/*
* 用来装饰门的门锁
*/
public class Lock extends Decorator
{
public Lock(Component component)
{
super(component);
}//end ConcreteDecorator1(...)
public void sampleOperation()
{
super.sampleOperation ();
System.out.println("Add a lock(锁)");
}//end sampleOperation()
}//end class Lock
package Decorator;
public class DecoratorPattern
{
private Component door = new Door();//创建一个扇门(向下转型)
private Component lock = new Lock(door);//添加一把锁(向下转型)
private Component knob = new Knob(lock);//再添加一个把手(向下转型)
public void showDecorator()
{
// door.sampleOperation();
// lock.sampleOperation();
knob.sampleOperation();
}//end showDecorator()
public static void main(String[] args)
{
System.out.println("Decorator Pattern!/n");
DecoratorPattern dp = new DecoratorPattern();
dp.showDecorator();
}//end main(...)
}//end class DecoratorPattern
下面是执行结果:
Decorator Pattern!
Build a door!
Add a lock(锁)
Add an Knob(把手)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=610788
相关文章推荐
- 《Java与模式》学习笔记之三-----装饰(Decorator)模式
- Java私塾:研磨设计模式 之 装饰模式(Decorator)3
- 设计模式之装饰模式(Decorator)摘录
- 设计模式:装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式实践(四)装饰模式(decorator)
- 设计模式2--装饰模式(the decorator design pattern)
- Java与模式:装饰(Decorator)模式
- 设计模式:Decorator(装饰)模式
- [设计模式-结构型]装饰模式(Decorator)
- 步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)
- 设计模式c#描述——装饰(Decorator)模式
- 扩展系统功能--装饰模式(Decorator)
- 装饰(Decorator)模式
- 装饰模式(Decorator)
- 装饰模式(Decorator)
- 结构型模式之装饰(Decorator)
- 结构型模式-Decorator ( 装饰模式 )
- 设计模式-装饰模式(Decorator Pattern)
- 设计模式(9)——Decorator(装饰)模式