装饰者设计模式

文章介绍了装饰模式,一种在不修改原有类和使用继承的情况下,通过组合来动态扩展一个对象功能的设计模式。具体实现包括原始接口、原始实现类、装饰者基类和具体装饰者类。装饰者基类持有原始对象的接口引用,各个装饰者类在其基础上增加特定功能,如加奶或加糖。客户端可以通过组合不同的装饰者来创建具有不同增强功能的对象。装饰模式与代理模式的区别在于前者侧重于使用装饰类组合增加功能,后者侧重于增强访问控制。

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

介绍:在不改变原有类和使用继承的情况下,动态扩展一个对象的功能。

结构:

原始接口、
原始实现类(要进行装饰的类)、
装饰者基类(实现产品接口的一个抽象类)、
具体装饰者实现类

实现:

在这里插入图片描述

1、原始接口

public interface ICoffee {
    void makeCoffee();
}

2、原始对象

public class OriginalCoffee implements ICoffee {
    @Override
    public void makeCoffee() {
        System.out.print("原味咖啡 ");
    }
}

3、装饰者基类(实现与原始对象相同的接口,内部持有一个接口类型的引用)

public abstract class CoffeeDecorator implements ICoffee {
    private  ICoffee coffee;
    public CoffeeDecorator(ICoffee coffee){
        this.coffee=coffee;
    }

    @Override
    public void makeCoffee() {
        coffee.makeCoffee();
    }
}

4、各种装饰者类(直接继承装饰者基类)

public class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(ICoffee coffee) {
        super(coffee);
    }
    @Override
    public void makeCoffee() {
        super.makeCoffee();
        addMilk();
    }
    private void addMilk(){
           System.out.print("加奶 ");
     }    
}
public class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(ICoffee coffee) {
        super(coffee);
    }
    @Override
    public void makeCoffee() {
        super.makeCoffee();
        addSugar();
    }
    private void addSugar(){
           System.out.print("加糖");
     } 
}

5、客户端调用

    public static void main(String[] args) {
        //原味咖啡
        ICoffee coffee=new OriginalCoffee();
        coffee.makeCoffee();
        System.out.println("");

        //加奶的咖啡
        coffee=new MilkDecorator(coffee);
        coffee.makeCoffee();
        System.out.println("");

        //先加奶后加糖的咖啡
        coffee=new SugarDecorator(coffee);
        coffee.makeCoffee();
    }

装饰模式精髓在于动态给对象增减功能

装饰模式通过组合排列方式给对象增减功能;代理模式通过继承给对象增减功能
装饰模式侧重于使用装饰类对原类的功能进行增减;代理模式侧重于增强被代理对象的访问
装饰者支持提供一组装饰者类,通过组成形成装饰栈,对某一个对象功能不断增强;而代理模式一般不会使用多级代理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值