三、装饰者模式:
- 用于动态的给一个对象添加额外的职责,增强功能:继承的方式会占用类的继承关键字,还有动态代理模式也可。
- 适用场景:
a. 处理那些可以撤销的职责
b. 在不影响其他对象的情况下动态添加职责 - 实现过程:
a. 写一个装饰类,提供私有构造方法,并传入被装饰者
b. 装饰者和被装饰者需要具有相同的方法,可以通过接口的方式。
c. 在装饰者内部添加新的功能。 - 四个角色:
a. 接口:统一被装饰者和装饰者方法
b. 被装饰者:实现接口,需要被改造的类
c. 抽象类装饰者:实现接口,定义统一的额外职责。
d. 具体装饰者:继承抽象类,增加具体的额外职责。
- 注:抽象类不是必须的。
- 代码实现:
//定义一个接口使得他们具有相同的方法 public interface Animals{ public void eat(); } //定义一个被装饰类 public class Man implements Animals{ public Man(){} @Override public void eat(){ System.out.println("吃"); } } //定义一个抽象装饰类 public abstract class Person implements Animals{ protected Animals animals; public void setAnimals(Animals animals){ super(); this.animals=animals; } @Override public void eat(){ animals.eat(); } public abstract void sleep(); public void talk(){ System.out.println("说"); } } //定义一个具体的装饰类,并加入可以起飞的功能 public class SuperMan extends Person{ public SuperMan(){} @Override public void eat(){ System.out.println("超人吃"); } @Override public void sleep(){ System.out.println("超人睡"); } @Override public void talk(){ System.out.println("超人说"); } public void fly(){ System.out.println("超人飞"); } }
在I/O中的使用
- java中的装饰者类和被装饰者类以及他们之间的关系(仅仅是InputStream的)
- 只要继承了FilterInputStream的类就是装饰者类,可以用于包装其他流,装饰者类还可以对装饰者和类进行再次包装。
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream("D:Demo.java")));
-
先用BufferedInputStream包装成缓冲流,在使用DataInputStream进一步包装。
-
参考链接:
https://www.cnblogs.com/panhouye/p/6120232.html
https://www.cnblogs.com/chenxing818/p/4705919.html
https://blog.youkuaiyun.com/u013309870/article/details/75735676