装饰者模式要点:
1. 装饰着与被装饰者拥有共同的超类
2. 继承的目的是实现类型的继承(从而实现行为的扩展)
3. 行为扩展(最终目的)
场景: 拥有主体类型或业务逻辑,但又具有个性化的处理场景
举例: 不同的咖啡不同的价格,但是计算价格的模式是一样的
代码如下
class="java">
/**
* 超类 咖啡
* @author john
*
*/
public abstract class Coffe {
//价格
public abstract double cost();
}
/**
* 摩卡咖啡(被装饰者)
* @author john
*
*/
public class MokaCoffe extends Coffe {
@Override
public double cost() {
// TODO 自动生成的方法存根
return 2.0;
}
}
/**
* Nes咖啡 被装饰者
* @author john
*
*/
public class NesCoffe extends Coffe {
@Override
public double cost() {
// TODO 自动生成的方法存根
return 3.0;
}
}
/**
* 调料组件(装饰者组件)
* @author john
*
*/
public abstract class CompentDecorate extends Coffe {
@Override
public abstract double cost();
}
/**
* 奶油调料(装饰者)
* @author john
*
*/
public class MilkCondiment extends CompentDecorate {
private Coffe coffe;
public MilkCondiment(){
}
public MilkCondiment(Coffe coffe){
this.coffe = coffe;
}
@Override
public double cost() {
// TODO 自动生成的方法存根
return 0.2+coffe.cost();
}
}
/**
* 糖调料 (装饰者)
* @author john
*
*/
public class sugarCondiment extends CompentDecorate {
private Coffe coffe;
public sugarCondiment(){
}
public sugarCondiment(Coffe coffe){
this.coffe = coffe;
}
@Override
public double cost() {
// TODO 自动生成的方法存根
return 0.1+coffe.cost();
}
}
public class Test {
public static void main(String[] args){
//咖啡 2.0
Coffe mokaCoffe = new MokaCoffe();
//扩展行为(价格)
//加牛奶的咖啡 0.2
mokaCoffe = new MilkCondiment(mokaCoffe);
System.out.println(mokaCoffe.cost());
//加糖的咖啡 0.1
mokaCoffe = new sugarCondiment(mokaCoffe);
System.out.println(mokaCoffe.cost());
}
}
//运行结果:
[img]
[/img]
- 大小: 13.2 KB