java设计模式——装饰者模式
Posted holajava
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式——装饰者模式相关的知识,希望对你有一定的参考价值。
目的
动态的给一个对象添加一些额外的职责。它使用客户端透明的方式来扩展对象功能,并且该模式要比继承更为灵活。
适用范围
- 以动态透明的方式来给单个对象添加职责。
- 处理可以撤销的职责。
不能采用生成子类的情况进行扩充。其一是有大量的扩展,为了支持每种组合需要产生大量的子类,使子类数目呈现爆炸性增长。其二是类的定义被隐藏或者不能用来生成子类。
涉及组件
- 抽象组件:定义一个抽象的接口,规范准备附加的类。
- 具体组件:将要被附加功能的类,它实现抽象的接口。
- 抽象装饰者:持有对具体构建角色的引用并且定义与抽象构建角色一致的接口。
具体装饰:实现抽象装饰者角色,负责对具体构建添加额外功能。
类图
代码
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();
}
}
小结
- 装饰者模式可以动态的将职责附加到对象身上。它提供了有别于类继承的另外一种灵活的扩展方式。
- 它在不修改原代码的情况下允许对象的行为被扩展。
- 它意味着一群包装具体组件的装饰者类。
- 装饰者模式可以在类的前边或者后边加上新的行为,甚至可以将类完全取代。
- 可以有多个装饰者对一个类进行装饰。
- 装饰者对组件的客户是透明的,除非客户程序依赖于具体的组件类型。
以上是关于java设计模式——装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章