(20160111)
【扣丁学堂】
装饰者设计模式:讲了一个以豆浆为主的消费记账系统
主料:豆浆
配料:糖 黑豆 五谷 鸡蛋
之间组合后有纯豆浆,糖豆浆,糖加黑豆豆浆,等等
看视频是跟着写的代码中写了一个接口,然后用两个类去实现,一个类返回(出口),一个类传入参数,
其他的去继承传入参数的类
我在想,既然都有豆浆,那么写一个接口,然后用豆浆类去实现接口,其他的类(如加糖,加鸡蛋)去继承豆浆类不就完了吗,然后在继承后的类中写含参构造函数来传参
如下图所示
视频中跟着敲出的代码如下
Drink.java
package com.molu.decorator;
/**
* 抽象的被装饰的接口
* @author Administrator
*
*/
public interface Drink {
public String description();
public float cost();
}
SoyaBeanMilk.java
package com.molu.decorator;
/**
* 具体的装饰者类
* @author Administrator
*
*/
public class SoyaBeanMilk implements Drink {
@Override
public String description() {
// TODO Auto-generated method stub
return "纯豆浆";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return 3f;
}
}
Decorator.java
package com.molu.decorator;
/**
* 装饰者抽象类
*
*/
public class Decorator implements Drink {
private Drink drink;//要装饰的对象
public Decorator(Drink drink) {
// TODO Auto-generated constructor stub
this.drink=drink;
}
@Override
public String description() {
// TODO Auto-generated method stub
return drink.description();
}
@Override
public float cost() {
// TODO Auto-generated method stub
return drink.cost();
}
//
}
EggDecorator.java
package com.molu.decorator;
public class EggDecorator extends Decorator {
public EggDecorator(Drink drink) {
// TODO Auto-generated constructor stub
super(drink);
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"+鸡蛋";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+3f;
}
}
SugarDecorator.java
package com.molu.decorator;
public class SugarDecorator extends Decorator {
public SugarDecorator(Drink drink) {
// TODO Auto-generated constructor stub
super(drink);
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"+糖";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+0.5f;
}
}
BlackBeanDecorator.java
package com.molu.decorator;
public class BlackBeanDecorator extends Decorator {
public BlackBeanDecorator(Drink drink) {
super(drink);
// TODO Auto-generated constructor stub
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"+黑豆";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+2f;
}
}
Test.java(测试)
package com.molu.decorator;
public class Test {
public static void main(String[] args) {
Drink drink=new SoyaBeanMilk();
SugarDecorator sugar=new SugarDecorator(drink);
BlackBeanDecorator blackBean=new BlackBeanDecorator(sugar);
EggDecorator egg=new EggDecorator(blackBean);
System.out.println("早餐是:"+egg.description());
System.out.println("共花了"+egg.cost());
}
}
按照自己想法写的
Drin,java
package com.molu.decor;
public interface Drin {
public String description();
public float cost();
}
Soya.java
package com.molu.decor;
public class Soya implements Drin {
// private Soya soya;
@Override
public String description() {
// TODO Auto-generated method stub
return "纯豆浆";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return 3f;
}
}
Egg.java
package com.molu.decor;
public class Egg extends Soya{
Soya soya;
public Egg(Soya soya) {
// TODO Auto-generated constructor stub
this.soya=soya;
}
@Override
public String description() {
// TODO Auto-generated method stub
return this.soya.description()+"+鸡蛋";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return this.soya.cost()+3f;
}
}
Sugar.java
package com.molu.decor;
public class Sugar extends Soya{
private Soya soya;
public Sugar(Soya soya) {
// TODO Auto-generated constructor stub
this.soya=soya;
}
@Override
public String description() {
// TODO Auto-generated method stub
return this.soya.description()+"+糖";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return this.soya.cost()+0.5f;
}
}
Black.java
package com.molu.decor;
public class Black extends Soya {
Soya soya;
public Black(Soya soya) {
// TODO Auto-generated constructor stub
this.soya=soya;
}
@Override
public String description() {
// TODO Auto-generated method stub
return this.soya.description()+"+黑豆";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return this.soya.cost()+2f;
}
}
Tes.java(测试)
package com.molu.decor;
public class Tes {
public static void main(String[] args) {
Soya drin=new Soya();
Egg egg=new Egg(drin);
Black black=new Black(egg);
Sugar sugar=new Sugar(black);
System.out.println("食物:"+sugar.description());
System.out.println("价格:"+sugar.cost()+"元");
}
}