装饰者模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
类图:
周五下班后,小程和小王相约去一家烧烤店,有烤鱼,烤鸡,烤肉,口味有麻辣,孜然,蒜香,并且不同口味之间可以组合,小程喜欢吃鱼,他点了一个麻辣孜然烤鱼,小王喜欢吃肉,她点了一份孜然蒜香烤肉(听起来就不好吃…),等了一会,烤肉上来了,果然味道不敢恭维,小王估计以后再也不会点这么奇葩的口味了,既然没办法吃饱,那就叫服务员把菜单拿来加个菜了,小王拿着菜单看了以后,对旁边的帅哥服务员说,来份烤鸡吧(怎么听起来怪怪的),估计刚才的阴影还在,所以点了一份原味烤鸡,好了,终于可以吃饱了,上菜。
类图:
Barbecue类代码实现:
package com.decorator;
public abstract class Barbecue {
String description = "Unknown Barbecue";
public String getDescription(){
return description;
}
public abstract double cost();
}
Fish类代码实现:
package com.decorator;
public class Fish extends Barbecue{
public Fish(){
description = "烤鱼";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 10;
}
}
Chicken类代码实现:
package com.decorator;
public class Chicken extends Barbecue{
public Chicken(){
description = "烤鸡";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 20;
}
}
Meat类代码实现:
package com.decorator;
public class meat extends Barbecue{
public meat(){
description = "烤肉";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 30;
}
}
BarbecueDecorator类代码实现:
package com.decorator;
public abstract class BarbecueDecorator extends Barbecue{
public abstract String getDescription();
}
Mala类代码实现:
package com.decorator;
public class Mala extends BarbecueDecorator{
Barbecue barbecue;
public Mala(Barbecue barbecue){
this.barbecue = barbecue;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return "麻辣,"+barbecue.description;
}
@Override
public double cost() {
// TODO Auto-generated method stub
return barbecue.cost() + 1;
}
}
Ziran类代码实现:
package com.decorator;
public class Ziran extends BarbecueDecorator{
Barbecue barbecue;
public Ziran(Barbecue barbecue){
this.barbecue = barbecue;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return "孜然,"+barbecue.getDescription();
}
@Override
public double cost() {
// TODO Auto-generated method stub
return barbecue.cost()+2;
}
}
Suanxiang类代码实现:
package com.decorator;
public class Suanxiang extends BarbecueDecorator{
Barbecue barbecue;
public Suanxiang(Barbecue barbecue){
this.barbecue = barbecue;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return "蒜香,"+barbecue.getDescription();
}
@Override
public double cost() {
// TODO Auto-generated method stub
return barbecue.cost()+3;
}
}
实例barbecueTest类代码实现:
package com.decorator;
public class barbecueTest {
public static void main(String[] argc){
Barbecue barbecue = new Chicken();
System.out.println(barbecue.getDescription()+",$:"+barbecue.cost());
Barbecue barbecue2 = new Fish();
barbecue2 = new Mala(barbecue2);
barbecue2 = new Ziran(barbecue2);
System.out.println(barbecue2.getDescription()+",$:"+barbecue2.cost());
Barbecue barbecue3 = new meat();
barbecue3 = new Suanxiang(barbecue3);
barbecue3 = new Ziran(barbecue3);
System.out.println(barbecue3.getDescription()+",$:"+barbecue3.cost());
}
}
结果:
烤鸡,$:20.0
孜然,麻辣,烤鱼,$:13.0
孜然,蒜香,烤肉,$:35.0
好了,菜上齐了,终于可以大吃一顿了。