设计模式之装饰模式

简介: 设计模式目录 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天前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
9 0
|
3月前
|
设计模式 中间件 PHP
设计模式 | 装饰模式
设计模式 | 装饰模式
14 0
|
5月前
|
设计模式
设计模式系列教程(12) - 装饰模式
设计模式系列教程(12) - 装饰模式
16 0
|
6月前
|
设计模式 算法 uml
结构型设计模式01-装饰模式
结构型设计模式01-装饰模式
15 0
|
6月前
|
设计模式
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
14 0
|
9月前
|
设计模式
设计模式——装饰模式
设计模式——装饰模式
43 0
|
4月前
|
设计模式 容器
设计模式之装饰模式(2)--有意思的想法
设计模式之装饰模式(2)--有意思的想法
|
4月前
|
设计模式
设计模式之装饰模式--优雅的增强
设计模式之装饰模式--优雅的增强
设计模式之装饰模式--优雅的增强
|
6月前
|
设计模式 Java 数据库连接
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
|
7月前
|
设计模式 存储 数据安全/隐私保护
23种设计模式漫画版系列—装饰模式
23种设计模式漫画版系列—装饰模式
46 0