装饰模式概念
Decorator模式是构造型的设计模式之一,它可以动态地改变一个对象方法的行为。
装饰模式类图
Component
原有类的接口
ConcreteComponent
功能实现类。Component的具体实现类
Decorator
装饰抽象类。与ConcreteComponent一样都继承了Component接口,但实现的方式与ConcreteComponent有区别。ConcreteComponent通过单纯继承的方式来实现;而Decorator则通过对Component对象的封装与动作委让方式来实现。
ConcreteDecoratorA与ConcreteDecoratorB
装饰(Decorator)的两个具体实现类
装饰模式范例
汽车上色的过程,要对从工厂刚出来的同一种汽车进行上色:
首先给汽车上相同的底色;
然后根据不同的要求,进行下面的操作:
- 有时希望上黄色
- 有时希望上红色
- 有时希望先上黄色,再上红色
- 有时希望先上红色,再上黄色
如果要在汽车类中完成上面的功能,不管是通过横向扩展(为类增加方法)还是纵向扩展(子类),都很难设计出柔软的可扩展的类结构。
上述过程用Decorator模式来描述:
汽车抽象类Car相当于Decorator模式类图中的Component,该接口定义了一个makeColor()方法用来给汽车上色
卡车类Truck相当于ConcreteComponent
上色抽象类MakeColorCar相当于Decorator
上黄色类MakeYellowColorCar与上红色类MakeRedColorCar就相当于ConcreteDecorator
public class Client {
public static void main(String[] args) {
// 生产一辆卡车1(基本色)
System.out.println("--Truck 1--");
Car truck = new Truck();
MakeColorCar yellowCar = new MakeYellowColorCar(truck);
MakeColorCar redCar = new MakeRedColorCar(yellowCar);
redCar.makeColor();
// 生产一辆卡车2(基本色)
System.out.println("--Truck 2--");
Car truck2 = new Truck();
MakeColorCar redCar2 = new MakeRedColorCar(truck2);
MakeColorCar yellowCar2 = new MakeYellowColorCar(redCar2);
yellowCar2.makeColor();
}
}
/**
* Component class & subclass.
*/
interface Car {
public void makeColor();
}
class Truck implements Car {
public void makeColor() {
System.out.println("Make basic-color for truck:");
}
}
/**
* Decorator class & subclass.
*/
abstract class MakeColorCar implements Car {
protected Car car;
public MakeColorCar(Car car) {
this.car = car;
}
public void makeColor() {
this.car.makeColor();
}
}
class MakeYellowColorCar extends MakeColorCar {
public MakeYellowColorCar(Car car) {
super(car);
}
public void makeColor() {
super.makeColor();
System.out.println("Add yellow.");
}
}
class MakeRedColorCar extends MakeColorCar {
public MakeRedColorCar(Car car) {
super(car);
}
public void makeColor() {
super.makeColor();
System.out.println("Add red.");
}
}
执行Client,输出结果:
C:\Decorator>javac *.java
C:\Decorator>java Client
--Truck 1--
Make basic-color for truck:
Add yellow.
Add red.
--Truck 2--
Make basic-color for truck:
Add red.
Add yellow.
对于类的不同对象truck1与truck2,我们可以应用Decorator模式改变其行为:我们为truck1先上底色,然后上黄色,再上红色;但为truck2先上底色,然后上红色,再上黄色。
装饰模式类比
Decorator模式与Adapter模式,Bridge模式的区别
:
有关Adapter模式和Builder模式的介绍,请参考下面2篇文章:
设计模式之Adapter - 适配器模式
设计模式之Bridge - 桥接模式
与Decorator模式一样,它们具有以下相同点:
- 都是构造型的设计模式
- 都是通过新类对原有类的封装(继承或委让的方式)
它们的不同点:
- 对象:Adapter强调外部接口,Bridge强调内部实现。Adapter通过提供新的接口形式隐蔽对原有类(功能)的调用,Bridge把同一事物的抽象与具体行为分离。
- 封装:Decorator可以不用修改原有对象接口,为对象增加新的功能或改变其行为;Adapter如需增加功能,则需修改接口。
举例来说,比如有一样东西,它提供a,b,c等功能,
采用Adapter模式来实现的话,就等于告诉用户,我有a, b, c等功能,你可以使用,但这些功能都是通过外部(调用其它类)实现的。
Bridge则这样告诉用户:有一样东西A,提供某项功能,这项功能可能是a, 或b, 或c功能,用户自己在使用A时,可以选择让A组合a功能(A+a),或b功能(A+b),或c功能(A+c)。
Decorator则是这样:有一样东西A,提供一个基本功能a。另外给它做了具有功能b的封套B,具有功能c的封套C。你可以在使用A时,把A装进B,或C里,这样就具有a+b,或a+c功能了,甚至还可以把装有A的B装入到C里,这样便具有a+b+c功能了。
- 大小: 6.8 KB
分享到:
相关推荐
### 开发模式之装饰模式详解 #### 装饰模式定义 装饰模式(Decorator Pattern)是一种结构型设计模式,允许向对象动态地添加新的功能,而无需修改其原有结构。这种模式通过创建一个新的包装类来包裹真实的对象,...
装饰模式是一种设计模式,它允许我们在不修改原有对象的基础上,通过添加新的行为或属性来扩展对象的功能。在"装饰模式小猪快跑游戏模拟"这个实例中,我们看到这种模式被巧妙地应用到了一个名为“小猪吃苹果”的游戏...
装饰模式是一种结构型设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改该对象的源代码。在C#中,装饰模式是通过创建一个包装类(Decorator),该包装类实现了与被装饰对象相同的接口,并持有被...
【装饰模式】是一种设计模式,源自Erich Gamma等人编写的《设计模式:可重用面向对象软件的基础》一书。这种模式在Swing开发中尤为常见,用于增强或改进现有对象的功能,尤其在Web应用程序中,如Java的J2EE环境,...
装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...
装饰模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。在Java中,装饰模式通常通过继承和组合来实现,提供了比子类化更灵活的方式来扩展对象的功能。 装饰模式的核心...
装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在软件工程中非常常见,因为它提供了灵活性,使得我们可以独立于对象的组合来扩展功能。 在C++中,装饰...
装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或属性,而不必修改原有类的代码。这种模式的核心在于装饰者和组件接口的统一,使得装饰者可以替代原对象并添加额外的功能。在"设计模式之...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...
装饰模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在不违背开闭原则(对扩展开放,对修改关闭)的前提下,提供了灵活的扩展机制。装饰模式通常用于为已有对象添加...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
装饰模式是一种设计模式,它允许在不改变对象自身的情况下,动态地给对象添加新的行为或职责。这种模式常用于在不修改源代码的情况下扩展对象的功能,或者为对象提供额外的职责。在本例中,"项目经理接到一个项目,...
装饰模式是一种设计模式,它允许我们在不改变对象本身的情况下,为对象添加新的行为或属性,从而扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭,这意味着我们可以灵活地增加一个对象的功能,而...
装饰模式是一种结构型设计模式,它允许我们向现有的对象添加新的功能,同时又不破坏其原有的结构。在C#中,装饰模式常用于在运行时动态地改变对象的行为,而无需修改原始类的代码。这种模式的核心在于装饰者类与被...
装饰模式是一种设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式在软件工程中非常有用,因为它提供了灵活性,使得代码可以在不破坏封装性的前提下进行扩展。 在"实验九:装饰...
装饰模式是一种设计模式,它允许在不修改对象本身的情况下,通过包装(或“装饰”)对象来动态地扩展其功能。在面向切面编程(Aspect Oriented Programming, AOP)中,装饰模式常被用来实现在运行时向目标对象添加...
装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式通常用于保持对象的原始类结构不变,同时增强其功能。HeadFirst 设计模式系列书籍以其生动有趣的插图和...
装饰模式是一种结构型设计模式,它允许我们向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在不违背开闭原则(对扩展开放,对修改关闭)的前提下,提供了灵活的扩展机制。在《Head First设计模式》一书...
装饰模式是一种结构型设计模式,它是面向对象设计中用来动态添加或修改对象功能的一种方法。在软件工程中,装饰模式允许我们向一个现有的对象添加新的行为或职责,同时又不改变其原有的结构,从而实现对类的功能扩展...
装饰模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在Java等面向对象编程语言中非常常见,因为它提供了灵活性,使得扩展对象的功能变得容易且优雅。在这个"装饰...