【设计模式】装饰模式

装饰模式:

动态的将责任附加到对象上

对于扩展性而言,装饰模式比继承更具有弹性,因为装饰模式利用组合关系

关键地方

让装饰者与被装饰者实现同一个接口,或者继承同一个抽象类,目的是为了让它们具有统一的类型

类型统一了,方法就可以接收所有的子类型,然后在运行时动态绑定到具体的子类对象上

 

===》接口:让装饰者与被装饰者具有统一的类型

package pattern.decorator;

public interface Food {
	String description();
	double cost();
}

 

package pattern.decorator;

public abstract class AbstractFood implements Food {
	
	protected String description = "未知食物";
	
	public String description() {
		return description + "(" + cost() + ")";
	}
}	

 

===》被装饰者

package pattern.decorator;

public class Noodle extends AbstractFood {
	public Noodle() {
		this.description = "面条";
	}

	public double cost() {
		return 5.00;
	}
}

 

package pattern.decorator;

public class Dumpling extends AbstractFood {
	public Dumpling() {
		this.description = "饺子";
	}

	public double cost() {
		return 8.00;
	}
}

 

===》装饰者

package pattern.decorator;

public class Cayenne implements Food {
	
	Food food;
	
	public Cayenne(Food food) {
		this.food = food;
	}

	public double cost() {
		return food.cost() + extraFee();
	}
	
	private double extraFee() {
		return 1.00;
	}

	public String description() {
		return food.description() + " + 辣椒(" + extraFee() + ")";
	}

}

 

package pattern.decorator;

public class Parsley implements Food {
	
	Food food;
	
	public Parsley(Food food) {
		this.food = food;
	}

	public String description() {
		return food.description() + " + 香菜(" + extraFee() + ")";
	}

	public double cost() {
		return food.cost() + extraFee();
	}
	
	private double extraFee() {
		return 0.50;
	}

}

 

===》测试

package pattern.decorator;

import java.text.NumberFormat;

public class Test {
	public static void main(String[] args) {
		Food food = new Noodle();
		food = new Cayenne(food);//装饰
		food = new Parsley(food);//装饰
		food = new Parsley(food);//再装饰
		
		String desc = food.description();
		System.out.println(desc);
		
		double total = food.cost();
		String cost = NumberFormat.getCurrencyInstance().format(total);
		System.out.println(cost);
		
	}
}

 

 面条(5.0) + 辣椒(1.0) + 香菜(0.5) + 香菜(0.5)
¥7.00

 

猜你喜欢

转载自just2learn.iteye.com/blog/2097516