2.装饰者模式
装饰者模式类似于代理,你将一个对象传进去装饰类,它将此对象的同名方法做一些加强
1.要被修饰的父类
/** * 粮食 * @author Administrator * */ public abstract class Beverage { String description="Unknown Beverage"; public String getDescription(){ return this.description; } public abstract double cost(); }
2.装饰的父类
/** * 加料 * @author Administrator * */ public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
3.创建两种被修饰的类
public class Rice extends Beverage { public Rice(){ description="饭"; } @Override public double cost() { // TODO Auto-generated method stub return 2.00; } } public class Noodle extends Beverage { public Noodle() { description="粉"; } @Override public double cost() { // TODO Auto-generated method stub return 1.00; } }
4.创建装饰类
public class Egg extends CondimentDecorator { private Beverage beverage; public Egg(Beverage beverage) { this.beverage=beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return "蛋炒"+this.beverage.getDescription(); } @Override public double cost() { // TODO Auto-generated method stub return 0.5+this.beverage.cost(); } }
5.组合(把被修饰的类进行装饰加强)
public class Cook { public static void main(String[] args) { //饭 Rice rice=new Rice(); //粉 Noodle noodle=new Noodle(); //蛋炒饭 Egg eggRice=new Egg(rice); System.out.println("套餐:"+eggRice.getDescription()+",售价:"+eggRice.cost()); //蛋炒粉 Egg eggNoodle=new Egg(noodle); System.out.println("套餐:"+eggNoodle.getDescription()+",售价:"+eggNoodle.cost()); //炒饭再加个蛋 Egg eggDoubleNoodle=new Egg(eggRice); System.out.println("套餐:"+eggDoubleNoodle.getDescription()+",售价:"+eggDoubleNoodle.cost()); } }
结果是这样的:
tip:这里,你可以说,干嘛这么麻烦,继承不就搞定了,但是,你有没有想过,如果万一有一点,没有蛋炒饭和蛋炒粉这菜式了,那这两个类不就废弃了吗,而且还要重新写,但是如果你做成组件形式的,即使你没有这两样菜式了,但是只要是蛋炒别的,那你照样可以用这个调料装饰类。这样子不只提高了类的可用性,更减少了类的无限增长.关键点就是通过注入来继承被装饰类的方法和字段,而不是通过简单地继承父类的信息。
本人倡导的讲解方式:代码示例[学以致用,不仅要知道理论,还要知道理论怎么付诸实践],
文字讲解[不仅知道要怎么用,还要知道是怎么回事],
画图讲解[有图有真相,用图的形式将代码嵌入到理论中,整体理解]