java设计模式——装饰者模式Decorator

java设计模式——装饰者模式

装饰模式又名包装(Wrapper)模式。装饰者模式是对已经实现功能的扩展,在原有功能的基础上添加新的功能,用来解决子类爆炸问题。

  • 抽象组件(Component)角色:一个抽象接口(如下文的Car类),是被装饰类和装饰类的父接口
  • 具体组件(ConcreteComponent)角色:抽象组件的实现类(如下文的RunCar类,实现了Car接口里的run() 方法)
  • 抽象装饰(Decorator)角色:持有一个组件(Component)对象的实例(如下文中的CarDecorator类),并申明一个与抽象组件接口一致的接口。
  • *具体装饰(ConcreteDecorator)角色:抽象装饰角色的实现类,负责新增功能(如下文的FlyDecorator类,SwimDecorator类)

抽象组件

//抽象组件:汽车类
public interface Car {
    //汽车的行驶方法
    public void run();
}

抽象组件的具体实现

//汽车的具体实现:普通汽车就只会跑的那种
public class RunCar implements Car {
    @Override
    public void run() {
        System.out.println("跑");
    }
}

抽象装饰角色

//抽象装饰角色:车的装饰类
public class CarDecorator implements Car {
  //持有抽象组件的具体实现对象,通过构造器注入
    public Car car;

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

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

抽象装饰角色的具体实现——fly装饰

//具体装饰角色:比如让车飞起来 QQ飞车那种
public class FlyDecorator extends CarDecorator {

    public FlyDecorator(Car car) {
        super(car);
    }

    @Override
    public void run() {
        super.run();//调用父类的方法,也就是不改变原有的方法,并添加自己的功能
        //自己添加的心功能
        System.out.println("飞");
    }

抽象装饰角色的具体实现——swim装饰

//具体装饰角色:比如让车会游泳
public class SwimDecorator extends CarDecorator {

    public SwimDecorator(Car car) {
        super(car);
    }

    @Override
    public void run() {
        super.run();
        System.out.println("游");
    }
}

测试方法

public class MainClass {
    public static void main(String[] args) {
        Car car = new RunCar();
        car.run();
        System.out.println("-------------------");
        Car flyCar = new FlyDecorator(car);
        flyCar.run();
        System.out.println("-------------------");
        Car swimCar = new SwimDecorator(car);
        swimCar.run();
        System.out.println("-------------------");
        Car swimFlyCar=new SwimDecorator(new FlyDecorator(car));
        swimFlyCar.run();
    }
}

控制台输出结果

跑
-------------------飞
-------------------游
-------------------
跑
飞
游

Process finished with exit code 0

举个例子~java中的IO流就用到了装饰这模式
博主第一次写博客,写的不好~嘿嘿嘿
想看更详细的文章可以看看这个博主的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值