装饰器模式是什么?
动态的给一个对象添加一些额外的功能,同事又不改变对象的结构。
装饰器模式的要素
- 被装饰对象(Bread)
- 装饰对象
- 装饰器(Decorator)
- 公共接口或者抽象类
简单例子
package myDesignPatternsTest.decoratorPattern;
/**
* 这是一个他们的公共父类(一般为抽象类或者接口)
*/
public abstract class Ingredient {
public abstract String getDescription();
public abstract Double getCost();
public void printDescription(){
System.out.println("Name:"+this.getDescription());
System.out.println("this value is :"+this.getCost());
}
}
package myDesignPatternsTest.decoratorPattern;
//被配饰对象
public class Bread extends Ingredient {
private String desc;
public Bread(String desc) {
this.desc = desc;
}
public String getDescription() {
return desc;
}
public Double getCost() {
return 26.8;
}
}
package myDesignPatternsTest.decoratorPattern;
/**
* 抽象装饰器是所有具体装饰器的的父亲
* 1.必须有一个他自己的父类(Ingreditne)作为自己的成员变量
* 2.必须继承公共父类
*/
public abstract class Decorator extends Ingredient {
Ingredient ingredient;
public Decorator(Ingredient ingredient) {
this.ingredient = ingredient;
}
public abstract String getDescription();
public abstract Double getCost();
}
package myDesignPatternsTest.decoratorPattern;
/**
* 具体配适器
* 1.对被配饰对象进行了加强
*/
public class Mutton extends Decorator {
public Mutton(Ingredient ingredient) {
super(ingredient);
}
public String getDescription() {
String base=ingredient.getDescription();
return base+"....."+"Decrocated is Mutton";
}
@Override
public Double getCost() {
Double base=ingredient.getCost();
double porkvalue=27.3;
return base+porkvalue;
}
}
package myDesignPatternsTest.decoratorPattern;
/**
* 具体配适器
*/
public class Pork extends Decorator {
public Pork(Ingredient ingredient) {
super(ingredient);
}
public String getDescription() {
String base=ingredient.getDescription();
return base+"....."+"Decrocated is Pork";
}
@Override
public Double getCost() {
Double base=ingredient.getCost();
double porkvalue=26.3;
return base+porkvalue;
}
}
package myDesignPatternsTest.decoratorPattern;
/**
* 具体配适器
*/
public class Celery extends Decorator {
public Celery(Ingredient ingredient) {
super(ingredient);
}
public String getDescription() {
String base=ingredient.getDescription();
return base+"....."+"Decrocated is Celery";
}
@Override
public Double getCost() {
Double base=ingredient.getCost();
double porkvalue=27.3;
return base+porkvalue;
}
}
package myDesignPatternsTest.decoratorPattern;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Ingredient a=new Mutton(new Bread("mutoon"));
a.printDescription();
Ingredient b=new Pork(new Bread("pork"));
b.printDescription();
}
}
Name:mutoon.....Decrocated is Mutton
this value is :54.1
Name:pork.....Decrocated is Pork
this value is :53.1
装饰器模式的优缺点
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。