首页 / 设计模式 / 设计模式--装饰者模式
设计模式--装饰者模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式--装饰者模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3806字,纯文字阅读大概需要6分钟。
内容图文
![设计模式--装饰者模式](/upload/InfoBanner/zyjiaocheng/998/404cf098766d4c6ab99cdaa59025c592.jpg)
咖啡馆订单项目:
1)、咖啡种类:Espresso、ShortBlack、LongBlack、Decaf
2)、调料:Milk、Soy、Chocolate
3)、扩展性好、改动方便、维护方便
一个差的方案:
一个好一点的设计方案
有些问题 : 1)增删调料种类 2)添加多份问题
装饰者模式就像打包一个快递
1)主体:陶瓷、衣服
2)包装:报纸填充、塑料泡沫、纸板、木板
装饰者模式:
装饰者模式: 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。
用装饰者模式重新设计的方案
装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack
对应代码演示:
package com.java.jikexueyuan.coffeebar; public abstract class Drink { public String description=""; private float price=0f;; public void setDescription(String description) { this.description=description; } public String getDescription() { return description+"-"+this.getPrice(); } public float getPrice() { return price; } public void setPrice(float price) { this.price=price; } public abstract float cost(); }
package com.java.jikexueyuan.coffeebar.coffee; import com.java.jikexueyuan.coffeebar.Drink; public class Coffee extends Drink {//单品 @Override public float cost() { // TODO Auto-generated method stub return super.getPrice(); } }
package com.java.jikexueyuan.coffeebar.coffee; public class LongBlack extends Coffee{//单品 public LongBlack() { super.setDescription("LongBlack"); super.setPrice(6.0f); } }
package com.java.jikexueyuan.coffeebar.decorator; import com.java.jikexueyuan.coffeebar.Drink; public class Decorator extends Drink { private Drink Obj; public Decorator(Drink Obj){ this.Obj=Obj; }; @Override public float cost() { // TODO Auto-generated method stub return super.getPrice()+Obj.cost(); } @Override public String getDescription() { return super.description+"-"+super.getPrice()+"&&"+Obj.getDescription(); } }
package com.java.jikexueyuan.coffeebar.decorator; import com.java.jikexueyuan.coffeebar.Drink; public class Milk extends Decorator {//调料 public Milk(Drink Obj) { super(Obj); // TODO Auto-generated constructor stub super.setDescription("Milk"); super.setPrice(2.0f); } }
package com.java.jikexueyuan.coffeebar.decorator; import com.java.jikexueyuan.coffeebar.Drink; public class Chocolate extends Decorator {//调料 public Chocolate(Drink Obj) { super(Obj); // TODO Auto-generated constructor stub super.setDescription("Chocolate"); super.setPrice(3.0f); } }
测试方法:
public static void main(String[] args) { Drink order; order=new Decaf(); System.out.println("order1 price:"+order.cost()); System.out.println("order1 desc:"+order.getDescription()); System.out.println("********包装开始********"); order=new LongBlack(); order=new Milk(order); order=new Chocolate(order); order=new Chocolate(order); System.out.println("order2 price:"+order.cost()); System.out.println("order2 desc:"+order.getDescription()); }
Java里装饰者介绍
扩展自定义IO
package com.java.jikexueyuan.myiodecorator; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; public class UpperCaseInputStream extends FilterInputStream{ protected UpperCaseInputStream(InputStream in) { super(in); // TODO Auto-generated constructor stub } public int read() throws IOException { int c=super.read(); return c==-1?c:Character.toUpperCase((char)(c)); } public int read(byte[] b,int offset,int len) throws IOException { int result=super.read(b,offset,len); for(int i=0;i<result;i++) { b[i]=(byte)Character.toUpperCase((char)(b[i])); } return result; } }
package com.java.jikexueyuan.myiodecorator; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class InputTest { public static void main(String[] args) { int c; try { InputStream in = new UpperCaseInputStream(new BufferedInputStream( new FileInputStream("F:\\test.txt"))); while((c=in.read())>=0) { System.out.print((char)c); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
内容总结
以上是互联网集市为您收集整理的设计模式--装饰者模式全部内容,希望文章能够帮你解决设计模式--装饰者模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。