装饰者模式

装饰者模式:

意图:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活,该模式以对客户端透明的方式扩展对象的功能

适用环境:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

通俗来讲,比如我们开个饮品店,主要卖牛奶,但是由于不同的需要,有的需要牛奶+糖,有的需要牛奶+珍珠,有的需要牛奶+冰等等等等,当然不同的方式,所需要的价格不一样,我们怎么办,每一种方式都写一个实现类嘛,这样实现类只会越来越多,这是我们就需要一个装饰类来处理这种事情,饮品店和牛奶就是我们被装饰的接口和被装饰的类,是比较抽象哈,上代码。

被装饰的接口

public interface Milk {
    /**
     * 计算价格
     */
    float price();

    /**
     * 牛奶成分的描述
     */
    String describe();
}

被装饰的类:

public class DrinkMilk implements Milk {

    @Override
    public float price() {
        return 10f;
    }
    @Override
    public String describe() {
        return "牛奶";
    }
}

具体的装饰类:

public abstract class Decorator implements Milk {
    private final Milk milk;

    public Decorator(Milk milk) {
        this.milk = milk;
    }

    @Override
    public float price() {
        return milk.price();
    }

    @Override
    public String describe() {
        return milk.describe();
    }
}

比如加鸡蛋(我们只需要继承这个装饰类就可以了)

public class Egg extends Decorator {
    public Egg(Milk milk) {
        super(milk);
    }

    @Override
    public float price() {
        return super.price() + 2;
    }

    @Override
    public String describe() {
        return super.describe() + "加鸡蛋";
    }
}

同样,比如加珍珠

public class Pearl extends Decorator {

    public Pearl(Milk milk) {
        super(milk);
    }

    @Override
    public float price() {
        return super.price() + 2;
    }

    @Override
    public String describe() {
        return super.describe() + "加珍珠";
    }
}

测试代码

public class Test1 {
    public static void main(String[] args) {
        // 一杯牛奶
        Milk milk = new DrinkMilk();
        // 加鸡蛋
        Egg egg = new Egg(milk);
        // 加珍珠
        Pearl pearl = new Pearl(egg);
        System.out.println(pearl.price());// 14.0
        System.out.println(pearl.describe());//牛奶加鸡蛋加珍珠
    }
}


posted @   JamieChyi  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示