装饰者模式与其在Java API中的运用
来源:互联网 发布:淘宝开店旺旺名 编辑:程序博客网 时间:2024/06/07 05:17
一、装饰者模式简介
装饰者模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,装饰者模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
1.基本原理
通过使用装饰者模式,可以在运行时扩充一个类的功能。原理是:增加一个装饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。装饰类必须和原来的类有相同的接口。
装饰者模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰者模式是在运行时增加行为。
当有几个相互独立的功能需要扩充时,这个区别就变得很重要。在有些面向对象的编程语言中,类不能在运行时被创建,通常在设计的时候也不能预测到有哪几种功能组合。这就意味着要为每一种组合创建一个新类。相反,装饰者模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合。一个装饰者模式的示例是JAVA里的 Java I/O Streams 的实现。
装饰者模式的UML类图:
2.示例代码
以 砂锅羊肉面 为实例,别问为什么,(╯°□°)╯︵┻━┻
Component相当于Marmite(砂锅)类:
public abstract class Marmite { String description = "砂锅"; public String getDescription() { return description; } public abstract Integer cost(); @Override public String toString() { return "这是一碗:" + getDescription() + ",价格:" + cost() + "元"; }}
ConcreteComponent是NoddlesMarmite(砂锅面条)类:
public class NoddlesMarmite extends Marmite { public NoddlesMarmite() { description = "砂锅面条"; } public Integer cost() { return 8; }}
Decorator是MaterialDecorator
public abstract class MaterialDecorator extends Marmite { public abstract String getDescription();}
ConcreteDecorator是MuttonMarmite:
public class MuttonMarmite extends MaterialDecorator { Marmite marmite; public MuttonMarmite(Marmite marmite) { this.marmite = marmite; } @Override public String getDescription() { return "羊肉、" + marmite.getDescription(); } @Override public Integer cost() { return 5 + marmite.cost(); }}
这是测试代码:
public class MarmiteTest { public static void main(String[] args) { Marmite marmiteNoddle = new NoddlesMarmite(); System.out.println(marmiteNoddle.toString()); Marmite muttonMarmiteNoddle = new MuttonMarmite(marmiteNoddle); System.out.println(muttonMarmiteNoddle.toString()); }}
二、Java API中装饰者的运用
先看一段demo
public class JavaDemo { public static void main(String[] args) { System.out.println("请输入一句话:"); BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in); String msg = "wocao"; try { BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(bufferedInputStream)); msg = bufferedReader.readLine(); } catch (Exception e){ e.printStackTrace(); } System.out.println("输入的是:" + msg); }}
这段代码的功能是将控制台中输入的内容打印出来。
查看 java api 得知
BufferedInputStream继承的是FilterInputStream,如下图:
FilterInputStream继承的是InputStream,并且有InputStream对象的一个引用
由此可以得出
InputStream相当于Component,FileterInputStream相当于Decorator,BufferedInputStream相当于ConcreteDecorator,System.in相当于ConcreteComponent。
三、自己实现一个关于InputStream的ConcreteDecorator
talk is cheap, show me the code
public class LowerCaseInputStream extends FilterInputStream { public LowerCaseInputStream(InputStream in){ super(in); } @Override public int read() throws IOException { int c=super.read(); return (c==-1?c:Character.toLowerCase((char)c)); } @Override public int read(byte[] b, int off, int len) throws IOException { int result=super.read(b,off,len); for(int i=off;i<off+result;i++){ b[i]=(byte)Character.toLowerCase((char)b[i]); } return result; }}
- 装饰者模式与其在Java API中的运用
- 生拉硬套设计模式(一),关于装饰者模式在Android项目中的运用。
- Java中的装饰者模式
- java中的装饰者模式
- 装饰者模式在Java 字节输入流中的应用
- 装饰者模式在Java I/O中的应用
- 设计模式在JAVA中的具体运用
- 设计模式在JAVA中的具体运用
- 设计模式在java中的运用
- 职责链模式在JAVA中的运用
- java中装饰者模式的运用实例
- java设计模式_工厂模式在开发中的运用
- java设计模式之---工厂模式在开发中的运用
- Java IO : 流,以及装饰器模式在其上的运用
- Java IO : 流,以及装饰器模式在其上的运用
- Java IO : 流,以及装饰器模式在其上的运用
- 装饰模式在Java I/O库中的应用
- JAVA中的装饰模式浅谈
- android数据库 批量 事务 操作
- DIY四旋翼笔记三 基于mpu6050的数字滤波算法
- android 发送短信的两种方式
- Unix高级编程-文件I/O
- Android热修复之 - 阿里开源的热补丁
- 装饰者模式与其在Java API中的运用
- 十行代码带你量化交易入门
- PHP和MySQL注入攻击
- 为什么要使用 99+,记一次 sql 优化(消息数量显示优化)
- 类加载机制
- Android Studio你不知道的调试技巧
- 使用px4编译代码时出现“no module names site”错误的解决办法
- IP地址转换成IP Number
- linux设置编译环境、补丁、查找、nfs技巧