设计模式——装饰器模式

装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案

装饰器模式中的角色有:

1、抽象构件角色

     给出一个抽象接口,以规范准备接受附加责任的对象

2、具体构建角色

    顶一个具体实现附加责任的类

3、装饰角色

   继承或者实现顶层对象或者接口,拥有顶层接口的引用

4、具体装饰角色

    继承装饰角色,添加额外装饰功能

举例说明:车的方法是 run。还有的车除了run还可以fly, 也还可以swim。代码如下

定义抽象构件角色:

public interface Car {
    public void run();
}

具体构件角色:

public class RunCar implements Car{
    public void run() {
        System.out.println("can run!");
    }
}
装饰角色:

public abstract class CarDecorator implements Car{
     Car car;
     public CarDecorator(Car car) {
        this.car = car;
     }
    public void run() {
        car.run();
    } 
}

具体装饰角色:

public class FlyCarDecorator extends CarDecorator{
    public FlyCarDecorator(Car car) {
        super(car);
    }
    public void run() {
        super.run();
        fly();
    }
    public void fly(){     //添加飞的功能
        System.out.println("can fly!");
    }
}

public class SwimCarDecorator extends CarDecorator{
    public SwimCarDecorator(Car car) {
        super(car);
    }
    public void run() {
        super.run();
        swim();
    }
    public void swim(){   //添加游的功能
        System.out.println("can swim!");
    }
}

测试运行:

public class MainTest {
    public static void main(String[] args) {
        Car car = new RunCar();
        FlyCarDecorator flyCarDecorator = new FlyCarDecorator(car);
        SwimCarDecorator swimCarDecorator = new SwimCarDecorator(flyCarDecorator);
        swimCarDecorator.run();
    }
}

运行结果为:can run!  can fly!  can swim!

装饰器模式在Java体系中的经典应用是Java I/O:比如inputstream

抽象构件角色:inputstream 

具体构件角色:ByteArrayInputStreamFileInputStream、ObjectInputStream、PipedInputStream  他们都继承了inputstream

装饰角色:FilterInputStream   FilterInputStream实现了InputStream内的所有抽象方法并且持有一个InputStream的引用

具体装饰角色:InflaterInputStream、BufferedInputStream、DataInputStream   全部继承了FilterInputStream

读取文件可以如下

File file = new File("D:/a.txt");
InputStream in1 = new FileInputStream(file);
InputStream in2 = new BufferedInputStream(new FileInputStream(file)); 
InputStream in3 = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));

in1 为 直接读取file

in2 给fileInputSteam 添加缓冲功能,使得FileInputStream读取文件的内容保存在内存中,以提高读取的功能

in3 给fileInputSteam 添加缓冲功能,因为它有DataInputStream和BufferedInputStream两个附加的功能

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值