IO之装饰模式

1、概念
大白话讲,比如说我们要装修一个房子,房子就是所谓的抽象构件角色,装修一个房子分为很多方面,比如说有美化的、有设置线路的,不同的人去做不同的工作,这些不同的人群就是所谓的不同的装饰角色,美化的又分为刷大白的、刷乳胶漆的、木工之类的,这些就是具体的装饰角色。但是不管干啥都得有干活的,这些干活的就是具体的构件角色。
2、IO对比
抽象构件角色——InputStrem或OutputStream
具体构件角色——FileInputStream或FileOutputStream
装饰角色——FilterInputStream或FilterOutputStream
具体装饰角色——BufferedInputStream、BufferedOutputStream或者DataInputStream、DataOutputStream
自己看API的继承关系就明白了。
3、代码实现:
package com.oracleoaec.decorator;

public class DecoratorDemo {

public static void main(String[] args) {
ConcreatComponet componet=new ConcreatComponet();
ConcreatDecoratorB cdb=new ConcreatDecoratorB(componet);
ConcreatDecoratorA cda=new ConcreatDecoratorA(cdb);
cda.doThingA();
}

}
//被装饰类的父类 相当于InputStream
abstract class Component{
public abstract void doThingA();
}
//被装饰的类 相当于FileInputStream
class ConcreatComponet extends Component{

@Override
public void doThingA() {
System.out.println("doThingA");
}
}
//装饰角色 相当于FileterInputStream
class Decorator extends Component{
private Component com;
public Decorator(Component com){
this.com=com;
}
@Override
public void doThingA() {
com.doThingA();
}
}
//具体装饰角色 相当于BufferedInputStream
class ConcreatDecoratorA extends Decorator{

public ConcreatDecoratorA(Component com) {
super(com);
}
public void doThingA(){
super.doThingA();
doThingB();
}
private void doThingB(){
System.out.println("doThingB");
}
}
//具体的装饰角色 相当于DataInputStream
class ConcreatDecoratorB extends Decorator{

public ConcreatDecoratorB(Component com) {
super(com);
}
public void doThingA(){
super.doThingA();
doThingC();
}
private void doThingC(){
System.out.println("doThingC");
}
}

猜你喜欢

转载自fengwuhen1990.iteye.com/blog/2342454