设计模式之装饰模式

简介: 设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 装饰模式 Decorator Pattern 动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活 通用类图 组成 抽象组件角色(Component) 定义一个接口或者抽象类,以规范
+关注继续查看

设计模式目录
http://blog.csdn.net/fenglailea/article/details/52733435
风.fox

装饰模式 Decorator Pattern

动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活

通用类图

装饰模式

组成

  • 抽象组件角色(Component)
    定义一个接口或者抽象类,以规范准备接受附加责任的对象,即可以给这些对象动态地添加职责。
  • 具体组件角色(ConcreteComponent)
    被装饰者
  • 抽象装饰器(Decorator)
    维持一个指向构件Component对象的实例,并定义一个与抽象组件角色Component接口一致的接口
  • 具体装饰器角色(ConcreteDecorator)
    向组件添加职责

案例

JAVA

// 抽象组件角色(Component)
public abstract class Component{
    public abstract void operate();
}
//具体组件角色(ConcreteComponent) 
public class ConcreteComponent extends Component{
    @OVerride
    public abstract void operate(){
        System.out.println("do Something");
    }
}
//抽象装饰器(Decorator)
public abstract class Decorator extends Component{
    private Component component=null;
    //通过构造函数传递被修饰者
    public Decorator(Component _component){
        THIS.component=_component;
    }
    //委托给被修饰者执行
    @OVerride
    public void operate(){
        this.component=operate();
    }
}
//具体装饰器角色(ConcreteDecorator)
public class ConcreteDecorator1 extends Decorator{
    //定义被修饰着
    public ConcreteDecorator1(Component _component){
        super(_component);
    }
    //定义自己的修饰方法
    private void method1(){
        System.out.println("method1 修饰");
    }
    //重写父类的operate方法
    public void operate(){
        this.method1();
        super.operate();
    }
}
public class ConcreteDecorator2 extends Decorator{
    //定义被修饰着
    public ConcreteDecorator2(Component _component){
        super(_component);
    }
    //定义自己的修饰方法
    private void method2(){
        System.out.println("method2 修饰");
    }
    //重写父类的operate方法
    public void operate(){
        this.method2();
        super.operate();
    }
}

//场景
public class Client{
    public static void main(String[] args){
        Component component= new ConcreteDecorator();
        // 第一次修饰
        component= new ConcreteDecorator1(component);
        // 第二次修饰
        component= new ConcreteDecorator2(component);
        // 修饰后执行
        component.operate();
    }
}

优点

装饰类和被装饰类可以独立发展,而不会相互耦合
装饰模式是继承关系的一个替代方案
装饰模式可以动态地扩展一个实现类的功能

使用场景

需要扩展一个类的功能,或给一个类增加附加功能
需要动态地给一个对象增加功能,这些功能可以再动态地撤销
需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式

目录
相关文章
|
7天前
|
设计模式
设计模式~~~装饰者模式
设计模式~~~装饰者模式
11 0
|
2月前
|
设计模式
设计模式之装饰者模式
设计模式之装饰者模式
14 0
|
3月前
|
设计模式
设计模式——装饰模式
设计模式——装饰模式
24 0
|
3月前
|
设计模式
设计模式 - 装饰模式
设计模式 - 装饰模式
|
3月前
|
设计模式 中间件 PHP
设计模式 | 装饰模式
设计模式 | 装饰模式
30 0
|
8月前
|
设计模式 Java uml
《设计模式》装饰者模式
《设计模式》装饰者模式
《设计模式》装饰者模式
|
10月前
|
设计模式
设计模式之装饰模式
设计模式之装饰模式
设计模式之装饰模式
|
10月前
|
设计模式 Java
23种设计模式——装饰者模式
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
40 0
|
11月前
|
设计模式 缓存 Java
浅析设计模式3 —— 装饰者模式
推荐语:本文从装饰者模式的核心思想到与其他设计模式的横向对比,从代码示例到业务实战,向读者娓娓呈现装饰者模式的真貌。深入浅出的JDK源码透析,使用场景的利弊权衡,真的值得一阅! ——大淘宝技术开发工程师 玄苏
浅析设计模式3 —— 装饰者模式
|
设计模式 Java
【设计模式】装饰者模式
 接着继续品读设计模式,下面介绍装饰者模式,装饰者模式在JAVA中的应用相当的广泛,如JAVA IO框架就是装饰者模式的典型应用,当时最开始使用JAVA IO时,简直是一团雾水,不明白读文件为什么需要用到这么多类,觉得很复杂,后来看了装饰者模式之后,再来看JAVA IO,则简单多了。下面,就一起来学习装饰者模式。
86 0
【设计模式】装饰者模式
推荐文章
更多