设计模式之装饰模式学习

强颜欢笑 提交于 2020-03-05 13:24:07

什么是装饰模式

装饰模式(Dec orator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。也就是说动态的给一个对象添加功能。

装饰模式的角色和职责

1、抽象组件角色:一个抽象接口,是被装饰类和装饰类的父接口。
2、具体组件角色:为抽象组件的实现类。
3、抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口。
4、具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰。

装饰模式的实现

以汽车为例,创建一个Car(抽象组件接口)以及MainClass

public interface Car{
	//用来展示功能
    public void show();

}

实现Car接口,并给与跑的功能(具体组件角色)

public class RunCar implements Car {
    //跑功能
    public void run(){
        System.out.println("可以跑的很快。");
    }
    @Override
    public void show() {
        this.run();
    }
}

在main类运行结果中,只能跑。
在这里插入图片描述
现在需要也能水里面开,那就要创建一个抽象装饰角色了。

public abstract class CarDecorator  implements Car {
    //包含了一个组件的接口并定义了与抽象组件一致的接口。
    private Car car;

    public CarDecorator(Car car){
        this.car = car;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

}

创建具有游泳的功能的类(具体装饰角色)

public class SwimCarDecorator extends CarDecorator {
    public SwimCarDecorator(Car car) {
        super(car);
    }

    @Override
    public void show() {
    	//这里是调用原有的功能
        this.getCar().show();
        //这里调用新添加的功能
        this.swim();
    }

    //添加游泳的功能
    public void swim(){
        System.out.println("可以下水了");
    }
}

在MainClass中测试。

		//普通的车
        Car runCar = new RunCar();
        runCar.show();
        System.out.println("-----------------");
        //让车可以下水
        CarDecorator swimcar = new SwimCarDecorator(runCar);
        swimcar.show();
        System.out.println("-----------------");
        //让这两车可以飞
        CarDecorator flycar = new FlyCarDecorator(swimcar);
        flycar.show();

运行结果如下
在这里插入图片描述

装饰模式的总结

在这种情况下如果不用装饰模式来实现功能的话就需要创建大量的子类,从而增加了主类的复杂度。
使用装饰模式情况下,只需要添加具体装饰类,从而有效地把主类的核心职责和装饰功能分开了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!