(20160111)
【扣丁学堂】
装饰者设计模式:讲了一个以豆浆为主的消费记账系统
主料:豆浆
配料:糖 黑豆 五谷 鸡蛋
之间组合后有纯豆浆,糖豆浆,糖加黑豆豆浆,等等
看视频是跟着写的代码中写了一个接口,然后用两个类去实现,一个类返回(出口),一个类传入参数,
其他的去继承传入参数的类
我在想,既然都有豆浆,那么写一个接口,然后用豆浆类去实现接口,其他的类(如加糖,加鸡蛋)去继承豆浆类不就完了吗,然后在继承后的类中写含参构造函数来传参
如下图所示
视频中跟着敲出的代码如下
Drink.java
package com.molu.decorator; /** * 抽象的被装饰的接口 * @author Administrator * */ public interface Drink { public String description(); public float cost(); }
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; } }
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; } }
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; } }
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(); }
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; } }
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; } }
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; } }
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; } }
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()+"元"); } }