装饰者模式的简单应用
来源:互联网 发布:matlab 矩阵动态添加 编辑:程序博客网 时间:2024/05/17 03:09
目录
如果你想动态的扩展 一个类的功能,可以看看 java.io.InputStream的源码,
* @see java.io.InputStream 抽象构件 * @see java.io.FilterInputStream 抽象装饰类 * @see java.io.BufferedInputStream 具体的装饰类 * @see java.io.DataInputStream 具体的装饰类
源码如下:
抽象构件
public abstract class InputStream implements Closeable { public abstract int read() throws IOException;}
抽象装饰类
装饰类 持有 抽象类(被装饰类)的 实例, 而且 是 volatile 修饰的,被多个线程共享,当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
public class FilterInputStream extends InputStream { protected volatile InputStream in; protected FilterInputStream(InputStream in) { this.in = in; } public int read() throws IOException { return in.read(); }
具体的装饰类
publicclass DataInputStream extends FilterInputStream{ public DataInputStream(InputStream in) { super(in); } public final int read(byte b[]) throws IOException { return in.read(b, 0, b.length); }}
或者
publicclass BufferedInputStream extends FilterInputStream {}
* 就是 抽象类A 被 继承者B 继承, 继承者B 拥有 抽象类的 实例,又有很多的 实现类CDEF 来 继承 继承者B,每个 CDEF 都可以 给这个 A的方法做 任何 操作,
public class DecoratorPattern { //抽象构件(Component) static abstract class Man { abstract void aboutMe(); } //具体的构件(ConcreteComponent) static class Potato extends Man { @Override public void aboutMe() { System.out.print("Hi,我是土豆"); } } //抽象装饰类(Decorator) static abstract class Decorator extends Man { private Man man; protected Decorator(Man man) { this.man = man; } @Override public void aboutMe() { man.aboutMe(); } } //具体装饰类(ConcreteDecorator) static class ProgrammerDecorator extends Decorator { public ProgrammerDecorator(Man man) { super(man); } @Override public void aboutMe() { super.aboutMe(); System.out.print(",我的职业是程序员"); } } //具体装饰类(ConcreteDecorator) static class ReaderDecorator extends Decorator { public ReaderDecorator(Man man) { super(man); } @Override public void aboutMe() { super.aboutMe(); System.out.print(",我喜欢读书"); } } //具体装饰类(ConcreteDecorator) static class GitHubDecorator extends Decorator { public GitHubDecorator(Man man) { super(man); } @Override public void aboutMe() { super.aboutMe(); System.out.print(",闲暇时我喜欢在 GitHub 上溜达"); } } //具体装饰类(ConcreteDecorator) static class WriterDecorator extends Decorator { public WriterDecorator(Man man) { super(man); } @Override public void aboutMe() { super.aboutMe(); System.out.print(",也会去写一些技术文章"); } } //具体装饰类(ConcreteDecorator) public static void main(String[] args) { Man potato = new Potato(); potato.aboutMe(); //Hi,我是土豆 System.out.println(); potato = new WriterDecorator( new GitHubDecorator( new ReaderDecorator( new ProgrammerDecorator(potato)))); potato.aboutMe(); //Hi,我是土豆,我的职业是程序员,我喜欢读书,闲暇时我喜欢在 GitHub 上溜达,也会去写一些技术文章 }}
阅读全文
0 0
- 装饰者模式的简单应用
- 装饰者模式的应用
- 装饰模式的应用
- 装饰模式的应用
- java io 装饰者模式的应用
- 装饰者模式的简单实现
- Java 装饰模式的应用
- 装饰模式简单的理解
- 装饰者模式实际应用
- 装饰者模式及其应用
- 装饰者模式及其应用
- 简单易懂装饰者模式
- 装饰者模式简单试验
- 装饰者模式在Android上的应用 之 Context
- 装饰者模式的应用——InputStream
- 浅谈装饰者模式的简单使用和思路
- 一个最简单的装饰模式
- 简单易解的装饰模式
- MyEclipse 10打war包时出错解决办法
- Linux电源管理(5)_Hibernate和Sleep功能介绍
- 如何消除word标题前面的竖线 ||Word中标题编号变为竖线处理
- SpringMVC中使用conversionSerivce不起作用解答
- Zookeeper + Kafka 集群搭建
- 装饰者模式的简单应用
- 数据库设计-范式
- 组合的输出
- 使用JS判断移动设备的终端类型(浏览器UserAgent)
- openssl 生成自签名证书
- Itext 导出pdf文件
- 测试以两个外键为复合主键的表,两个外键空值情况
- Java中的各种变量
- Java调用微信扫码支付接口(模式二)