一.定义,及设计要点
定义:装饰者设计模式是给被装饰者对象动态添加新功能,类似的java IO 的设计也是装饰者模式的应用,它使程序更加灵活易扩展。
设计要点:装饰者和被装饰者共同继承同一个父类,继承的目的在于继承类型,而不是行为,装饰者类拥有一个该父类的对象,所以具体的装饰者类中就可以包装另一个
装饰者或者被装饰者,这样就可以对被装饰者的功能进行额外的增强,具体的看下面的例子会比较清晰。
二. 举例
说明:下面举一个买手抓饼算价格的例子,买手抓饼加鸡蛋,加火腿动态的算价格;
Grab.java 共同父类对象,是一个抽象方法
package com.yaspeed.java.decorator;
//定义被装饰对象:手抓饼
public abstract class Grab {
private String name;
private float price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public abstract float cost();
}
HandGrab.java 具体手抓饼
package com.yaspeed.java.decorator;
public class HandGrab extends Grab{
public HandGrab(){
super.setName("手抓饼");
super.setPrice(3.0f);
}
@Override
public float cost() {
// TODO Auto-generated method stub
return super.getPrice();
}
}
装饰者对象
package com.yaspeed.java.decorator;
//定义装饰者
public class Decorator extends Grab{
private Grab grab;
public Decorator(Grab grab){
this.grab = grab;
}
@Override
public float cost() {
//具体装饰者价格+被装饰者费用,形成了递归调用累加所有费用
return super.getPrice()+grab.cost();
}
/* (non-Javadoc)
* @see com.yaspeed.java.decorator.Grab#getName()
*/
@Override
public String getName() {
// TODO Auto-generated method stub
return grab.getName();
}
}
下面为两个具体装饰者:鸡蛋,火腿
package com.yaspeed.java.decorator;
public class Egg extends Decorator{
public Egg(Grab grab) {
super(grab);
super.setName("鸡蛋");
super.setPrice(1.5f);
}
/* (non-Javadoc)
* @see com.yaspeed.java.decorator.Grab#getName()
*/
@Override
public String getName() {
// TODO Auto-generated method stub
return super.getName()+" 加鸡蛋";
}
}
package com.yaspeed.java.decorator;
public class Banger extends Decorator{
public Banger(Grab grab) {
super(grab);
super.setName("火腿");
super.setPrice(2.0f);
}
/* (non-Javadoc)
* @see com.yaspeed.java.decorator.Grab#getName()
*/
@Override
public String getName() {
// TODO Auto-generated method stub
return super.getName()+" 加火腿";
}
}
测试:
package com.yaspeed.java.decorator;
public class Main {
public static void main(String[] args) {
HandGrab handGrab = new HandGrab();
System.out.println(handGrab.getName()+"费用:"+handGrab.cost());
Egg egg = new Egg(handGrab);
System.out.println(egg.getName()+"费用:"+egg.cost());
Banger banger = new Banger(egg);
System.out.println(banger.getName()+"费用:"+banger.cost());
}
}
结果:
手抓饼费用:3.0
手抓饼 加鸡蛋费用:4.5
手抓饼 加鸡蛋 加火腿费用:6.5