08装饰模式

一、什么是装饰模式

  装饰( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,
是继承关系的一个替换方案。


二、装饰模式的结构

一环套一环!

继承、关联(传参)

三、装饰模式的角色和职责

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


四、代码示例实现

目标:车可以具有跑的功能,若要实现飞和游泳的功能,可以采用传统的方法继承或者接口来实现

现在想使用装饰模式来实现该功能。

1.car接口类(基本(抽象)组件)

public interface Car {

    public abstract void run();
    public abstract void show();
}

2.可以跑得车类Runcar(具体组件角色)

public class RunCar implements com.dzg.learn.decorator.Car {//有两个同名的接口,引起了冲突
    @Override
    public void run() {
        System.out.println("可以跑");
    }

    @Override
    public void show() {

        this.run();
    }
}

3.可以飞的车(抽象类装饰角色),实现了Car接口

public abstract class CarDecorator implements Car{

    private Car car;

    public Car getCar() {
        return car;
    }

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

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

    public abstract void show();
}

4.可以游泳的车(抽象类装饰角色)

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

    @Override
    public void run() {

    }

    public void swim(){
        System.out.println("可以游泳");
    }
    @Override
    public void show() {
        this.getCar().show();
        //this.show();傻屌,这你也敢!!!死循环了啊。。。。。。。
        this.swim();
    }
}
测试

public class TestDecorator {
    public static void main(String[] args) {
       // CarDecorator carDecorator = new CarDecorator();抽象类不能实例化
        Car car = new RunCar();//接口Car有两个,引起了冲突
        car.show();

        System.out.println("==============================");
        FlyCarDecorator flyCarDecorator = new FlyCarDecorator(car);//传递的参数是基础的car,具体的装饰角色
        flyCarDecorator.show();

        System.out.println("==============================");
        SwimCarDecorator swimCarDecorator = new SwimCarDecorator(flyCarDecorator);//实现跑、飞、游的功能,具体的装饰角色
        swimCarDecorator.show();
    }
}

测试结果:

   

可以跑
==============================
可以跑
可以飞
==============================
可以跑
可以飞
可以游泳

总结:装饰模式的使用,可以作为类之间继承的替换

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值