装饰模式(Decorator)

给某个对象,动态新增功能。

构成:

1、抽象接口:真实对象与装饰对象实现同一个接口。

2、装饰父类:持有一个真实对象的引用,即可为真实对象新增功能。

3、真实对象:被扩展的对象。

4、装饰对象:继承装饰父类,负责添加功能的装饰对象。


 

比如:

 

  我有一个IO输出流,它只能写入字节数据。真实对象:FileOutputStream

  我需要新增传写入对象的功能。则需要一个装饰对象:ObjectOutputStream

  使用起来就是:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(data)));
oos.writeObject(obj);

又比如:

  车车都实现了InCar接口。

  我有一辆普通的车车,它只能在路上跑。真实对象:Car

  我需要新增飞起来的功能,自动驾驶的功能。需要两个装饰对象:FlyCar、AiCar

  使用起来就是:

 AiCar ac = new AiCar(new FlyCar(new Car()));
 ac.ai();

 

例子

抽象角色:

/**
 * Component 抽象角色:真实对象与装饰对象实现同一个接口。
 */
public interface InCAr {
    void run();//车都会跑
}

真实对象:被扩展的对象

class Car implements InCAr{
    @Override
    public void run() {
        System.out.println("平平无奇小车车跑起来了。");
    }
}

装饰角色:持有一个抽象构件的引用,即可新增功能。

class SuperCar implements InCAr{
    private InCAr car;//持有一个抽象构件的引用,即可新增功能。

    public SuperCar(InCAr car) { this.car = car; }

    @Override
    public void run() {
        car.run();
    }
}

装饰对象一:新增飞行功能

具体的装饰类,继承了装饰角色,通过super可调用run方法,即保留了原来的功能,又新增了新的功能。可以在共同方法中实现多重复合。

class FlyCar extends SuperCar{
    public FlyCar(InCAr cAr) {
        super(cAr);
    }
    //新增飞的功能
    public void fly(){
        System.out.println("飞起来了。");
    }

    @Override
    public void run() {//同一个方法支持复合添加功能
        fly();
        super.run();
    }
}

装饰对象二:新增自动驾驶功能

class AiCar extends SuperCar{
    public AiCar(InCAr cAr) {
        super(cAr);
    }
    //新增自动驾驶的功能
    public void ai(){
        System.out.println("Ai操控中。");
    }

    @Override
    public void run() {//同一个方法支持复合添加功能
        ai();
        super.run();
    }
}

测试:

public class CLient {
    public static void main(String[] args) throws Exception {
        //普通的车车
        Car car = new Car();
        car.run();
        System.out.println("--------------------");
//创建一个会飞的车车 FlyCar flyCar = new FlyCar(car); flyCar.fly();//新增方法 System.out.println("--------------------");
flyCar.run();
//共同方法,新增飞 System.out.println("--------------------");
//创建一个自动驾驶,且会飞的车 AiCar aiCar = new AiCar(new FlyCar(car)); aiCar.ai();//新增方法
System.out.println("--------------------");
aiCar.run();
//共同方法,新增自动驾驶、飞 } }

运行结果:

 

posted @ 2022-11-25 16:00  在博客做笔记的路人甲  阅读(79)  评论(0编辑  收藏  举报