美文网首页
装饰者模式

装饰者模式

作者: sakura_L | 来源:发表于2023-04-12 17:28 被阅读0次

    简介

    • 装饰者模式是一种结构型设计模式,它允许你在运行时动态地将责任附加到对象上,而不会影响其他对象。该模式可以在不使用子类继承的情况下扩展对象的功能。

    用途

    • 装饰者模式的主要用途是在不影响其他对象的情况下,动态地为对象添加新的行为。例如,在一个系统中有一个基本的对象,我们可以使用装饰者模式来为该对象添加新的功能或行为,这样可以保证对象的原有功能不受影响,同时也不需要修改基本对象的代码。

    • 另一个常见的用途是在复杂的继承结构中,使用装饰者模式来代替继承。继承在一定程度上增加了代码的复杂性,而且一旦继承结构变得太深,就很难进行维护和扩展。装饰者模式可以帮助我们避免这种问题,因为它允许我们在运行时动态地为对象添加新的行为,而不需要创建大量的子类。

    应用场景

    • 动态地给对象添加新的行为,而不影响其他对象。
    • 避免使用大量的子类继承来扩展对象的功能。
    • 在不改变原有代码的情况下,为对象添加新的行为。
    • 用于构建具有复杂功能的对象。

    代码

    以下为动态给coffee添加属性的代码,通过给接口不添加装饰者实现更多的功能
    public class Test {
    
        public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
            Coffee coffee = new SimpleCoffee();
            coffee = new Milk(coffee);
            coffee = new Sugar(coffee);
            System.out.println(coffee.getCost());
            System.out.println(coffee.getDescription());
    
        }
    
    }
    // 定义咖啡接口
    interface Coffee {
        double getCost();
        String getDescription();
    }
    
    // 实现简单的咖啡类
    class SimpleCoffee implements Coffee {
        @Override
        public double getCost() {
            return 1.0;
        }
    
        @Override
        public String getDescription() {
            return "Simple coffee";
        }
    }
    
    // 定义装饰者类
    abstract class CoffeeDecorator implements Coffee {
        protected Coffee decoratedCoffee;
    
        public CoffeeDecorator(Coffee coffee) {
            this.decoratedCoffee = coffee;
        }
    
        public double getCost() {
            return decoratedCoffee.getCost();
        }
    
        public String getDescription() {
            return decoratedCoffee.getDescription();
        }
    }
    
    // 实现具体的装饰者类:牛奶
    class Milk extends CoffeeDecorator {
        public Milk(Coffee coffee) {
            super(coffee);
        }
    
        public double getCost() {
            return super.getCost() + 0.5;
        }
    
        public String getDescription() {
            return super.getDescription() + ", milk";
        }
    }
    
    // 实现具体的装饰者类:糖
    class Sugar extends CoffeeDecorator {
        public Sugar(Coffee coffee) {
            super(coffee);
        }
    
        public double getCost() {
            return super.getCost() + 0.2;
        }
    
        public String getDescription() {
            return super.getDescription() + ", sugar";
        }
    
    }
    

    相关文章

      网友评论

          本文标题:装饰者模式

          本文链接:https://www.haomeiwen.com/subject/ofjoddtx.html