Java IO学习之装饰器&适配器模式

本文详细介绍了Java中的装饰器模式和适配器模式。装饰器模式用于动态地给对象添加额外职责,增强功能,适用于无法采用继承进行功能扩展的情况。文章通过代码示例展示了装饰器模式在穿衣服、吃鸡蛋煎饼等场景的应用。适配器模式则旨在解决接口不匹配导致的兼容性问题,使得不同接口的类能够一起工作。文章通过类适配器、对象适配器和接口适配器的示例解释了适配器模式的实现方式。此外,文章还讨论了这两种模式在Java IO流中的具体体现。
摘要由CSDN通过智能技术生成

一、装饰器模式

概念:又名包装(Wrapper)模式,动态地给对象添加额外的职责,从增强功能的角度来说,Decorator模式比子类继承更加灵活,Decorator模式以对客户端透明的方式扩展对象功能

应用场景

  • 以动态、透明的方式增强对象功能
  • 增强的功能可以被撤销
  • 无法采用子类继承增强的情况

装饰器结构

  • Componet:定义一个抽象类
//可以是接口,可以是抽象类
public interface Component {
    public void func();
}
  • ConcreteComponent:定义一个对象,继承自Component,实现Component中方法
public class ConcreteComponent implements Component {
    @Override
    public void func() {
        //TODO 实际业务1
    }
    //此对象独有的方法,与装饰器无关,因为Component接口没有定义func1()
    //Decorator传入的new ConcreteComponent对象,向上转型Component时只有父类Component的方法和属性    
    //在装饰器里没必要定义这种方法,这里只是说明向上转型的问题
    public void func1(){
        //TODO 实际业务2,此业务无法被装饰
    }
}
  • Decorator:定义一个装饰器抽象类,维持一个指向Component实例引用,并且定义个与Component接口一致的接口
public class Decorator implements Component {
    //定义指向Component的实例引用
    private Component component;
    //构造函数初始化component
    public Decorator(Component component) {
        this.component = component;
    }
    //Decorator继承ConcreteComponent实际业务1,可添加的基类的装饰业务
    @Override
    public void func() {
        //继承实际业务1
        component.func();
        //实际业务1内部扩展基类的装饰业务
        func2(){//do sth}
    }
    //不在实际业务1内扩展,单独扩展基类的其他装饰业务,
    public void functest(){//do sth}
}
  • ConcreteDecorator:具体的装饰对象,给对象增强功能
public class ConcreteDecoratorA extends Decorator {
    //构造函数初始化ConcreteComponent
    public ConcreteDecoratorA(Component component) {
        //采用Decorator构造函数初始化
        super(component);
    }
    //继承装饰器基类Decorator的实际业务1+基类的装饰业务,再添加其他具体的装饰业务
    @Override
    public void func() {
        //继承的实际业务1+基类的装饰业务
        super.func();
        //具体ConcreteComponentA添加的其他装饰业务等
        func3(){//do sth}
    }
    //具体的其他的装饰业务
    public void func4(){//do sth}
}

:关于向上转型,向下转型的概念可自行百度,示例

Component c= new ConcreteComponent(); //向上转型
c.func1();//编译报错

ConcreteComponent中的 func1() 方法是独属于ConcreteComponent对象的方法,在Java中父类引用指向子类对象是自动成功的,但是父类引用指向子类对象,只能调用来自父类的属性/行为,所以上面第二行代码编译报错。

装饰器示例代码——穿衣服

package Decorator;

//Component抽象类或者接口——美女
interface BeautifulGirl {
    public void dressup();
}

//wpp是美女的实例
class Wpp implements BeautifulGirl {
    @Overri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值