装饰设计模式(Decorator)-IO

一、装饰设计模式

  • 对一组对象的功能进行增强(对已有类进行增强使用装饰设计模式)
  • 缓冲区就是根据装饰设计模式设计出来了的,增强了字符、字节流类。
  • 继承虽然也能够实现功能的扩展和增强,但是会导致继承体系越来越臃肿,不够灵活,装饰比继承灵活。
  • 特点:装饰类和被装饰类都必须所属同一个接口或着父类

女人——化妆+学习——完美的女人
房子——装修——漂亮的房子

  • 能用接口多态,就不要用继承
  • 继承形式
//测试
public class Text {
    public static void main(String[] args) {        
        People p = new ChGF(new TgGF(new People("张三", "男")));//父类引用指向子类对象   
        p.GF();     
    }
}
//
//原类——人
public class People {

    private String name;    
    private String sex;

    public People(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public String getSex() {
        return sex;
    }

    public void GF() {
        System.out.println("我不会功夫");
    }
}

//抽象类继承原类,重写原类的所有方法,封装一个原类
public abstract class WipperPeople extends People {

    private People people;

    public WipperPeople(People people) {
        super(people.getName(), people.getSex());       
        this.people = people;
    }

    @Override
    public String getName() {
        return people.getName();
    }

    @Override
    public String getSex() {
        return people.getSex();
    }

    @Override
    public void GF() {
        people.GF();
    }
}

//继承抽象类的多种包装类
public class ChGF extends WipperPeople {

    public ChGF(People people) {
        super(people);
    }

    @Override
    public void GF() {
        super.GF();
        System.out.println("我拜了李小龙为师,现在我也会中国功夫了!");
    }   
}

public class TgGF extends WipperPeople {

    public TgGF(People people) {
        super(people);
    }

    @Override
    public void GF() {
        super.GF();
        System.out.println("我去了趟泰国,学会了泰拳!");
    }   
}
  • 接口形式
//接口:原类规范
//原类 实现 接口
//抽象类 实现 接口,内部封装一个原类,重写接口所有方法
//包装类继承抽象类,可根据需要覆写方法
//测试,接口类引用指向实现类对象
  • LineNumberReader(一个装饰类)
  • 跟踪行号,可以设置和获取当前行号,默认从0开始编号
public class Demo {
    public static void main(String[] args) throws IOException {
        FileReader f = new FileReader("Demo(1).txt");
        LineNumberReader l = new LineNumberReader(f);
        String line = null;
        l.setLineNumber(2);//设置行号从哪里开始
        while((line = l.readLine()) != null) {
            sopl(line + ",,," + l.getLineNumber());//获取行号和每行内容
        }
        l.close();
    }
}
//读.java文件时使用

你可能感兴趣的:(装饰设计模式(Decorator)-IO)