美文网首页JavaJava设计模式
设计模式-装饰者模式

设计模式-装饰者模式

作者: smallmartial | 来源:发表于2019-04-11 11:40 被阅读5次

装饰者模式概念:

装饰者模式又名包装(Wrapper)模式。装饰者模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

装饰模式的结构

装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰者模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。

装饰者模式UML类图:


装饰者模式类图

装饰者模式中的角色有:

  • 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
  • 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
  • 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

装饰模式实例演示:

儿子、妈妈、父亲三人合作画一幅画,儿子负责画出一朵花的轮廓,妈妈负责涂上颜色、父亲负责将画裱在画框里。请编写程序模拟这个过程。UML类图如下:


UML

代码实现:
接口类:

public interface Painter {

    public void draw();
}

具体构建son类:

public class Son implements Painter {

    @Override
    public void draw() {
        System.out.println("我是儿子,我花了花的轮廓");
    }
}

抽象角色Decorater类:

public abstract class Decorator implements Painter {

    private Painter painter;
    
    public Decorator(Painter painter) {
        this.painter = painter;
    }

    public void draw() {
        painter.draw();
    }

}

具体装饰角色mother:

public class Mother extends Decorator {
    
    public Mother(Painter painter) {
        super(painter);
    }

    public void draw() {
        super.draw();
        System.out.println("Mother Draw");
        this.color();

    }
    
    public void color(){
        System.out.println("我是妈妈,我给画涂色");
    }
}

具体装饰角色father:

public class Father extends Decorator {
    public Father(Painter painter) {
        super(painter);
    }
    public void draw() {
        super.draw();
        System.out.println("Father Draw");
        this.mounting();
    
    }
    public void mounting(){
        System.out.println("我是爸爸,我将画裱起来");
    }
}

实现类:

public class Application {
    public static void main(String[] args) {
        Painter son = new Son();
        son.draw();
        Decorator son1=new Mother(son); 
        son1.draw();
        Decorator son2=new Father(son); 
        son2.draw();
    
        //System.out.println();
    
    }
}

运行结果:


result.png

装饰者模式的优缺点

装饰者模式的优点:

  • 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
  • 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

装饰者模式的缺点:

  • 由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。

相关文章

  • 设计模式

    设计模式 单例模式、装饰者模式、

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计

    JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式 装饰器模式,又名装饰者模式。它的定义是“在不...

  • 8种设计模式:

    主要介绍 单例设计模式,代理设计模式,观察者设计模式,模板模式(Template), 适配器模式,装饰模式(Dec...

  • 装饰者模式

    JavaScript 设计模式 张容铭第十二章 房子装修--装饰者模式 (102页) 装饰者模式(Decorato...

  • Summary of February 2017

    READING Head First 设计模式:完成50%。内容:观察者模式、装饰者模式、工厂模式、单件模式、命令...

  • 装饰对象:装饰者模式

    装饰对象:装饰者模式   这是《Head First设计模式(中文版)》第三章的读书笔记。   装饰者模式,可以称...

  • 设计模式之装饰器模式

    也称装饰者模式、装饰器模式、Wrapper、Decorator。 装饰模式是一种结构型设计模式,允许你通过将对象放...

网友评论

    本文标题:设计模式-装饰者模式

    本文链接:https://www.haomeiwen.com/subject/tazziqtx.html