装饰模式 Decorator Pattern

本文深入探讨装饰模式,一种通过不改变原有代码结构的方式扩展对象功能的技术。通过实例解析,展示如何使用装饰模式在不修改原有类的基础上添加新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

二、装饰模式的结构
看图



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

抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口。

具体组件角色:为抽象组件的实现类。

抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口。

具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰。

Car.java
package com.ibeifeng.news; 

public interface Car { 
 
    public void show(); 
 
    public void run(); 
}
RunCar.java
package com.ibeifeng.news; 

public class RunCar implements Car { 
 
    public void run() { 
        System.out.println("可以跑"); 
    } 
 
    public void show() { 
        this.run(); 
    } 
 
}
CarDecorator.java
package com.ibeifeng.news; 

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(); 
    public abstract void run(); 
}
FlyCarDecorator.java
package com.ibeifeng.news; 

public class FlyCarDecorator extends CarDecorator{ 
 
    public FlyCarDecorator(Car car) { 
        super(car); 
    } 
 
    public void show() { 
        this.getCar().show(); 
        this.fly(); 
    } 
 
    public void fly() { 
        System.out.println("可以飞"); 
    } 
 
    public void run() { 
 
    } 
}
SwimCarDecorator.java
package com.ibeifeng.news; 

public class SwimCarDecorator extends CarDecorator { 
 
    public SwimCarDecorator(Car car) { 
        super(car); 
    } 
 
    public void show() { 
        this.getCar().show(); 
        this.swim(); 
    } 
 
    public void swim() { 
        System.out.println("可以游"); 
    } 
 
    public void run() { 
 
    } 
 
}
MainClass.java
package com.ibeifeng.news; 

public class MainClass { 
    public static void main(String[] args) { 
        Car car = new RunCar(); 
 
        car.show(); 
        System.out.println("---------"); 
 
        Car swimcar = new SwimCarDecorator(car); 
        swimcar.show(); 
        System.out.println("---------"); 
 
        Car flySwimCar = new FlyCarDecorator(swimcar); 
        flySwimCar.show(); 
    } 
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值