顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:
Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:
[java] view plaincopy
- public interface Sourceable {
- public void method();
- }
[java] view plaincopy
- public class Source implements Sourceable {
- @Override
- public void method() {
- System.out.println("the original method!");
- }
- }
[java] view plaincopy
- public class Decorator implements Sourceable {
- private Sourceable source;
- public Decorator(Sourceable source){
- super();
- this.source = source;
- }
- @Override
- public void method() {
- System.out.println("before decorator!");
- source.method();
- System.out.println("after decorator!");
- }
- }
测试类:
[java] view plaincopy
- public class DecoratorTest {
- public static void main(String[] args) {
- Sourceable source = new Source();
- Sourceable obj = new Decorator(source);
- obj.method();
- }
- }
输出:
before decorator!
the original method!
after decorator!
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!
==================================================================
另外一个例子:
/** * Test.java * Created on 2013-8-1 上午10:02:29 */ package my; /** * <p>Project: Test2</p> * <p>Title: Test.java</p> * <p>Description: </p> * <p>Copyright (c) 2013 Wilmar Consultancy Services</p> * <p>All Rights Reserved.</p> * @author <a href="mailto:liyong@wcs-global.com">liyong</a> */ public class Test { public static void main(String[] args) { Teacher t1 = new SimpleTeacher(); Teacher t2 = new CppTeacher(t1); Teacher t3 = new JavaTeacher(t2); t3.teach(); // t.teach(); } } abstract class Teacher { public abstract void teach(); } class SimpleTeacher extends Teacher { public void teach() { System.out.println("Good Good Study, Day Day Up"); } } class JavaTeacher extends Teacher { Teacher teacher; public JavaTeacher(Teacher t) { this.teacher = t; } public void teach() { teacher.teach(); System.out.println("Teach Java"); } } class CppTeacher extends Teacher { Teacher teacher; public CppTeacher(Teacher t) { this.teacher = t; } public void teach() { teacher.teach(); System.out.println("Teach C++"); } }
3、===============================================================
装饰模式:给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。
UML类图:
组成部分:
抽象构件:原始的功能接口
具体构件:具体的原始功能类
装饰角色:持有具体构件类的对象,以便执行原有功能
具体装饰:具体扩展的功能在这里
下面看一个对开车功能拓展的实例(晚上+开车):
抽象构件:
- package com.gjy.drector;
- /**
- * 抽象接口,规范准备接收附加责任的对象
- * @author gjy
- */
- public interface Component {
- public void operation();
- }
具体构件:
- package com.gjy.drector;
- /**
- * 接收附加责任, 此类型的类可以有多个, 只对应一个Decorator类
- * @author gjy
- */
- public class ConcreteComponent implements Component {
- public ConcreteComponent(){}
- public void operation()
- {
- System.out.println("开车");
- }
- }
装饰角色:
- package com.gjy.drector;
- /**
- * 装饰角色,持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
- * @author gjy
- */
- public class Decorator implements Component {
- private Component component;
- public Decorator(){}
- public Decorator(Component component)
- {
- this.component = component;
- }
- public void operation() {
- component.operation();
- }
- }
具体装饰:
- package com.gjy.drector;
- /**
- * 添加附加责任
- * @author gjy
- */
- public class ConcreteDecorator extends Decorator {
- public ConcreteDecorator(){}
- public ConcreteDecorator(Component component)
- {
- super(component);
- }
- public void operation()
- {
- this.addedOperation();
- super.operation();
- }
- public void addedOperation()
- {
- System.out.println("晚上");
- }
- }
测试:
- package com.gjy.drector;
- /**
- * 客户端类
- * @author gjy
- */
- public class Client {
- public static void main(String[] args) {
- Component component = new ConcreteComponent();
- Decorator decorator = new ConcreteDecorator(component);
- //客户端不变, 但已增加了责任
- decorator.operation();
- }
- }
输出结果:
晚上
开车
相关推荐
c++设计模式-结构型模式-装饰器模式;QT工程;...装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...
装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或职责,同时保持对象的接口不变。这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可...
装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...
装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类,该类包装了原始类的实例,并在调用原始类方法之前或之后添加额外的...
装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...
装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...
结构型模式如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy),则关注如何组合和连接类与对象,以达到新的功能。行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式...
装饰者模式是设计模式中的一种结构型模式,它在不改变原有对象的基础上,动态地给对象添加新的行为或属性,以此来扩展对象的功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭,是一种非常实用的设计策略。 ...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第10节:结构型模式Decorator装饰模式
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或增强现有功能,而无需改变该对象的类。在C#中,装饰模式通常通过继承和组合来实现,它提供了一种灵活的方式来动态地改变对象的行为。在这个“C#...
### C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) #### 一、背景介绍 在面向对象编程中,设计模式是一种在特定情况下解决问题的标准化方法。其中,装饰模式(Decorator Pattern)作为结构型模式...
装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码或创建子类。这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变...
装饰模式是一种结构型设计模式,它是面向对象设计中用来动态添加或修改对象功能的一种方法。在软件工程中,装饰模式允许我们向一个现有的对象添加新的行为或职责,同时又不改变其原有的结构,从而实现对类的功能扩展...