设计模式-装饰器模式(Decorator Pattern)

装饰器模式是什么?

动态的给一个对象添加一些额外的功能,同事又不改变对象的结构。

装饰器模式的要素

  1. 被装饰对象(Bread)
  2. 装饰对象
  3. 装饰器(Decorator)
  4. 公共接口或者抽象类
设计模式-装饰器模式(Decorator Pattern)
装饰器模式示意图

简单例子

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

装饰器模式的优缺点

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。