设计模式(二)之装饰器模式

简介: 定义一个代表被装饰事物的接口:public interface Coffee { public String getCoffer(); public double getPrice();}最初的具体事物:public class Starbucks implements Coffee { @Override pub

定义一个代表被装饰事物的接口:

public interface Coffee {

    public String getCoffer();

    public double getPrice();
}

最初的具体事物:

public class Starbucks implements Coffee {

    @Override
    public String getCoffer() {
        return "星巴克";
    }

    @Override
    public double getPrice() {

        return 10D;
    }

}

被装饰后的具体事物:

public class Seasoning implements Coffee {

    private Coffee coffee;

    public Seasoning(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public String getCoffer() {
        return coffee.getCoffer();
    }

    @Override
    public double getPrice() {
        return coffee.getPrice();
    }
}

一号装饰器:

public class SeasoningOne extends Seasoning implements Coffee {

    public SeasoningOne(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getCoffer() {
        return super.getCoffer() + " 糖";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 1.0D;
    }

}

二号装饰器:

public class SeasoningTwo extends Seasoning implements Coffee {

    public SeasoningTwo(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getCoffer() {
        return super.getCoffer() + " 牛奶";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 5.0D;
    }
}

三号装饰器:

public class SeasoningThree extends Seasoning implements Coffee {

    public SeasoningThree(Coffee coffee) {
        super(coffee);
    }
    @Override
    public String getCoffer() {
        return super.getCoffer() + " 摩卡";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 3.0D;
    }
}

使用者:

public class Consumer {

    public static void main(String[] args) {
        Coffee coffee = new SeasoningOne(new Seasoning(new Starbucks()));

        System.out.println(coffee.getCoffer() + ":" + coffee.getPrice());

        coffee = new SeasoningTwo(new SeasoningOne(new Seasoning(
                new Starbucks())));

        System.out.println(coffee.getCoffer() + ":" + coffee.getPrice());
        coffee = new SeasoningThree(new SeasoningTwo(new SeasoningOne(
                new Seasoning(new Starbucks()))));

        System.out.println(coffee.getCoffer() + ":" + coffee.getPrice());

    }
}
目录
相关文章
|
8月前
|
设计模式 存储 缓存
聊聊Java设计模式-装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,`FileInputStream`(处理文件)、`ByteArrayInputStream`(处理字节数组)、`BufferedInputStream`(带缓存的处理类)等就是对`InputStream`进行的功能扩展,这就是装饰器模式的典型应用。
68 1
聊聊Java设计模式-装饰器模式
|
8月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
77 2
|
8月前
|
设计模式
设计模式之装饰器模式
设计模式之装饰器模式
|
8月前
|
设计模式
设计模式-装饰器模式
设计模式-装饰器模式
|
3月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
42 0
|
25天前
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
|
8月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
72 1
|
4月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
7月前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
7月前
|
设计模式 架构师 安全
设计模式第五讲-装饰器模式和代理模式详解
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
285 0