Java 装饰器的简要理解
开发工具与关键技术:java、 elipse2019、jdk1.8
作者:Amewin
撰写时间:2019年5月8日
装饰器模式
装饰器模式又称为包装(Wrapper)模式。装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰器模式的结构
通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类的方式并不可取,在面向对象的设计中,我们应该尽量使用组合对象而不是继承对象来扩展和复用功能,装饰器模式就是基于对象组合的方式的。
装饰器模式以对客户端透明的方式动态地给一个对象附加上了更多的责任。换言之,客户端并不会角色对象在装饰前和装饰后有什么不同。装饰器模式可以在不用创建更多子类的情况下,将对象的功能加以扩展。
装饰器模式中的角色有:
1、抽象构件角色
给出一个抽象接口,以规范准备接受附加责任的对象
2、具体构件角色
定义一个将要接受附加责任的类
3、装饰角色
持有一个构建对象的实例,并定义一个与抽象构件接口一致的接口
4、具体装饰角色
负责给构建对象贴上附加的责任
装饰器模式的例子
package xyz.test02.www;
public class MainZhuangShiLei {
public static void main(String[] args) {
Water waters =new SpringWaterimple();
Water mikes = new Mike(waters);
Water sugers = new Sugers(mikes);
Water waterlll = new Ningneng(sugers);
System.err.println("价格:"+mikes.jieGe()+"\n"+"产品名称:"+mikes.name()+"\n"+"产品介绍:"+mikes.jieSao());
System.err.println("价格:"+sugers.jieGe()+"\n"+"产品名称:"+sugers.name()+"\n"+"产品介绍:"+sugers.jieSao());
System.err.println("价格:"+waters.jieGe()+"\n"+"产品名称:"+waters.name()+"\n"+"产品介绍:"+waters.jieSao());
System.err.println("价格:"+waterlll.jieGe()+"\n"+"产品名称:"+waterlll.name()+"\n"+"产品介绍:"+waterlll.jieSao());
}
}
//1.抽象组件
interface Water{
double jieGe();
String name();
String jieSao();
}
//2.具体组件
class SpringWaterimple implements Water{
String name = "农夫山泉";
String nameType = "农夫山泉,有点甜";
@Override
public double jieGe() {
return 3;
}
@Override
public String name() {
return name;
}
@Override
public String jieSao() {
return nameType;
}
}
//3、抽象装饰类
abstract class waterAdd implements Water {
private Water water;
public waterAdd(Water water) {
this.water = water;
}
public String name() {
return this.water.name();
}
public String jieSao() {
return this.water.jieSao();
}
public double jieGe() {
return this.water.jieGe();
}
}
//
class Mike extends waterAdd{
public Mike(Water water) {
super(water);
}
@Override
public String name() {
return super.name()+"牛奶农夫山泉。";
}
@Override
public String jieSao() {
return super.jieSao()+"加牛奶的农夫山泉。";
}
@Override
public double jieGe() {
return super.jieGe()*3 ;
}
}
class Sugers extends waterAdd{
public Sugers(Water water) {
super(water);
}
@Override
public String name() {
return super.name()+"红糖农夫山泉。";
}
@Override
public String jieSao() {
return super.jieSao()+"加红糖的农夫山泉。";
}
@Override
public double jieGe() {
return super.jieGe()+3 ;
}
}
class Ningneng extends waterAdd{
public Ningneng(Water water) {
super(water);
}
public String name() {
return super.name()+"加柠檬。";
}
public String jieSao() {
return super.jieSao()+"加柠檬的农夫山泉。";
}
public double jieGe() {
return super.jieGe()+10 ;
}
}
装饰器模式的优缺点
优点
1、装饰器模式与继承关系的目的都是要扩展对象的功能,但是装饰器模式可以提供比继承更多的灵活性。装饰器模式允许系统动态决定贴
上一个需要的装饰,或者除掉一个不需要的装饰。继承关系是不同,继承关系是静态的,它在系统运行前就决定了
2、通过使用不同的具体装饰器以及这些装饰类的排列组合,设计师可以创造出很多不同的行为组合
缺点
由于使用装饰器模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是另一方面,由于使用装饰器
模式会产生比使用继承关系更多的对象,更多的对象会使得查错变得困难,特别是这些对象看上去都很像。