1.定义
装饰者模式:动态的将责任附加到对象上,若要拓展功能,装饰者提供比继承更有弹性的替代方案类应该对拓展开发,对修改关闭,想想观察者模式
2.简介
装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。虽然装饰者模式能够动态将责任附加到对象上,但是他会产生许多的细小对象,增加了系统的复杂度。
3.类图
![](https://img.haomeiwen.com/i5613468/2e8994bacec692ad.png)
4.实例
如果对多态理解不深刻,请先理解多态,要不然方法调用顺序会糊里糊涂。
本实例会先调用SausageDecorator的create()方法,向上调用Decorator的create()方法,由于SausageDecorator里传递是EggDecorator对象,Decorator的create()调用实际是EggDecorator的方法,以此向上传递调用。
package designMode;
import java.io.IOException;
/**
* <p>
* 装饰者模式:动态的将责任附加到对象上,若要拓展功能,装饰者提供比继承更有弹性的替代方案
* 类应该对拓展开发,对修改关闭,想想观察者模式
*/
public class DecoratorPattern {
public static void main(String[] args) throws IOException {
Potato potato = new Potato();
Hamburger hamburger = new SausageDecorator(new EggDecorator(potato));
hamburger.create();
hamburger.price();
}
//抽象构件(Component)
static abstract class Hamburger{
private Integer price=1;
abstract void create();
abstract Integer price();
}
//具体的构件(ConcreteComponent)
static class Potato extends Hamburger {
@Override
void create() {
System.out.println("这是一个普通的汉堡包,价格为:"+super.price);
}
@Override
Integer price() {
Integer price = super.price;
return price;
}
}
//抽象装饰类(Decorator)
static abstract class Decorator extends Hamburger {
private Hamburger hamburger;
protected Decorator(Hamburger hamburger) {
this.hamburger = hamburger;
}
@Override
public void create() {
hamburger.create();
}
@Override
public Integer price() {
return hamburger.price();
}
}
//具体装饰类(ConcreteDecorator)
static class EggDecorator extends Decorator {
public EggDecorator(Hamburger hamburger) {
super(hamburger);
}
@Override
public void create() {
super.create();
System.out.print("加了一个蛋");
}
@Override
public Integer price() {
int i = super.price() + 1;
System.out.println("现在价格为:"+i);
return i;
}
}
//具体装饰类(ConcreteDecorator)
static class SausageDecorator extends Decorator {
public SausageDecorator(Hamburger hamburger) {
super(hamburger);
}
@Override
public void create() {
super.create();
System.out.print("加了一个香肠");
}
@Override
public Integer price() {
int i = super.price() + 1;
System.out.println("现在价格为:"+i);
return i;
}
}
}
网友评论