码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-12-07 00:54:32      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:对象   stat   ora   类型   new   image   ring   png   nts   

目的

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

适用范围

  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设计模式——装饰者模式

标签:对象   stat   ora   类型   new   image   ring   png   nts   

原文地址:https://www.cnblogs.com/holaJava/p/12000133.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!