1、装饰者模式的定义:
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
2、装饰者模式的适用场景:
1> 需要动态的给一个对象添加功能,这些功能可以再动态的撤销
2> 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实
3> 当不能采用生成子类的方法进行扩充时
3、装饰者模式的类图形式:
4、装饰者模式的具体实现:
例如:要做一个饼并且声明是手抓饼,需要在手抓饼里面添加其他的材料例如牛肉、鸡蛋、生菜等等。。。此时饼就是一个被装饰者的抽象父类,对应类图中的接口,这个抽象父类包含其下具体的实现子类的一些共有的属性方法,饼分为很多种,此时手抓饼就是该抽象父类的一个具体的实现子类,也是被装饰者。而牛肉、鸡蛋这些就是装饰者,用来装饰这个手抓饼,类图中被装饰者与装饰者之间存在关联关系,就是通过装饰者的父类与实现被装饰者的父类实现的,这些具体的实体类就好比牛肉鸡蛋。
代码实现如下:
package DecoratorModel;
/**
* 被装饰者的抽象父类
*
*/
public interface Cake {
public float price();
public String description();
}
package DecoratorModel;
/**
* 被装饰者的实体类(手抓饼)
*
*/
public class GraspCake implements Cake{
public float price() {
return 3.0f;
}
public String description() {
return "您点了一个原味手抓饼";
}
}
package DecoratorModel;
/**
* 装饰着的父类
*
*/
public abstract class Decorator implements Cake{
//体现和被装饰者的关联关系
private Cake cake;
public Decorator(Cake cake){
this.cake = cake;
}
public float price() {
return cake.price();
}
public String description() {
return cake.description();
}
}
package DecoratorModel;
public class BeefDecorator extends Decorator{
public BeefDecorator(Cake cake) {
super(cake);
}
public float price() {
return super.price()+2.0f;
}
public String description() {
return super.description()+"+牛排";
}
public void test2(){
System.out.println("测试2");
}
}
package DecoratorModel;
/**
* 装饰着的具体实体类
*
*/
public class EggDecorator extends Decorator{
public EggDecorator(Cake cake) {
super(cake);
}
public float price() {
return super.price()+1.5f;
}
public String description() {
return super.description()+"+鸡蛋";
}
public void test(){
System.out.println("鸡蛋装饰测试函数");
}
}
package DecoratorModel;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
public class Test {
public static void main(String[] args) {
InputStream ins;
InputStream fis = new FileInputStream();
InputStream ois = new ObjectInputStream(fis);
InputStream dis = new DataInputStream(ois);
Cake gc = new GraspCake();
Cake ed = new EggDecorator(gc);
Cake bf = new BeefDecorator(gc);
System.out.println(bf.price());
System.out.println(bf.description());
}
}