java设计模式——装饰者模式

Posted holajava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式——装饰者模式相关的知识,希望对你有一定的参考价值。

目的

动态的给一个对象添加一些额外的职责。它使用客户端透明的方式来扩展对象功能,并且该模式要比继承更为灵活。

适用范围

  1. 以动态透明的方式来给单个对象添加职责。
  2. 处理可以撤销的职责。
  3. 不能采用生成子类的情况进行扩充。其一是有大量的扩展,为了支持每种组合需要产生大量的子类,使子类数目呈现爆炸性增长。其二是类的定义被隐藏或者不能用来生成子类。

    涉及组件

  4. 抽象组件:定义一个抽象的接口,规范准备附加的类。
  5. 具体组件:将要被附加功能的类,它实现抽象的接口。
  6. 抽象装饰者:持有对具体构建角色的引用并且定义与抽象构建角色一致的接口。
  7. 具体装饰:实现抽象装饰者角色,负责对具体构建添加额外功能。

    类图

    技术图片

代码

Component

public interface Person{

    void say();
}

ConcreteComponent

public class Man implements Person{
    
    public void say(){
        System.out.println("hello,");
    }
}

Decorator

public abstract class Decorator implements Person{
    
    protected Person person;

    public void setPerson(Person person){
        this.person = person;
    }

    public void say(){
        person.say();
    }
}

ConcreteDecorator

public class menDecoratorA extends Decorator{
    
    public void say(){
        super.say();
        reSay();
        System.out.println("menDecoratorA类");
    }

    public void reSay(){
         System.out.println("Nice to meet you!");
    }
}
public class menDecoratorB extends Decorator{
    
    public void say(){
        super.say();
        System.out.println("How are you");
        System.out.println("menDecoratorB类");
    }
}

Test

public class Main{
    
    public static void main(String args[]){
        Man man = new Man();
        menDecoratorA md1 = new menDecoratorA();
        menDecoratorB md2 = new menDecoratorB();

        md1.setPerson(man);
        md2.setPerson(md1);
        md2.say();
    }
}

小结

  1. 装饰者模式可以动态的将职责附加到对象身上。它提供了有别于类继承的另外一种灵活的扩展方式。
  2. 它在不修改原代码的情况下允许对象的行为被扩展。
  3. 它意味着一群包装具体组件的装饰者类。
  4. 装饰者模式可以在类的前边或者后边加上新的行为,甚至可以将类完全取代。
  5. 可以有多个装饰者对一个类进行装饰。
  6. 装饰者对组件的客户是透明的,除非客户程序依赖于具体的组件类型。

以上是关于java设计模式——装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式之装饰者模式

设计模式-装饰者模式(Go语言描述)

设计模式-装饰者模式(Go语言描述)

java-装饰者模式

java设计模式--装饰者模式

JAVA装饰者模式(从现实生活角度理解代码原理)