专业编程基础技术教程

网站首页 > 基础教程 正文

java设计模式-装饰器模式

ccvgpt 2024-08-04 12:15:45 基础教程 9 ℃

装饰器模式是一种结构型设计模式,它允许你在不改变对象接口的前提下动态地添加功能。这是通过创建一个包装器类,包装原始类来实现的。下面是一个Java装饰器模式的示例代码:

// 接口定义组件对象
interface Coffee {
    double getCost();
    String getDescription();
}
// 具体组件类
class SimpleCoffee implements Coffee {
    @Override
    public double getCost() {
    		return 2.0;
    }
    @Override
    public String getDescription() {
    		return "Simple Coffee";
    }
}
// 装饰器抽象类
abstract class CoffeeDecorator implements Coffee {
    protected final Coffee decoratedCoffee;
    public CoffeeDecorator(Coffee coffee) {
  		  this.decoratedCoffee = coffee;
    }
    @Override
    public double getCost() {
   		 return decoratedCoffee.getCost();
    }
    @Override
    public String getDescription() {
   		 return decoratedCoffee.getDescription();
    }
}
// 具体装饰器类
class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee coffee) {
  		  super(coffee);
    }
    @Override
    public double getCost() {
    		return super.getCost() + 0.5;
    }
    @Override
    public String getDescription() {
   		 return super.getDescription() + ", Milk";
    }
}
class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee coffee) {
  		  super(coffee);
    }
    @Override
    public double getCost() {
  		  return super.getCost() + 0.2;
    }
    @Override
    public String getDescription() {
 		   return super.getDescription() + ", Sugar";
    }
}
public class TestDemo {
      public static void main(String[] args) {
          // 创建基础的咖啡
          Coffee coffee = new SimpleCoffee();
          System.out.println("Cost: " + coffee.getCost() + ", Description: " + coffee.getDescription());
          // 使用装饰器添加牛奶
          Coffee milkCoffee = new MilkDecorator(coffee);
          System.out.println("Cost: " + milkCoffee.getCost() + ", Description: " + milkCoffee.getDescription());
          // 使用装饰器再添加糖
          Coffee sugarMilkCoffee = new SugarDecorator(milkCoffee);
          System.out.println("Cost: " + sugarMilkCoffee.getCost() + ", Description: " + sugarMilkCoffee.getDescription());
      }
}

//运行结果:
Cost: 2.0, Description: Simple Coffee
Cost: 2.5, Description: Simple Coffee, Milk
Cost: 2.7, Description: Simple Coffee, Milk, Sugar

类调用关系如图:

java设计模式-装饰器模式

在这个示例中,Coffee 接口定义了组件对象,SimpleCoffee 是具体组件类。CoffeeDecorator 是装饰器的抽象类,而 MilkDecoratorSugarDecorator 是具体装饰器类。你可以看到如何使用装饰器来动态地添加牛奶和糖到咖啡中,而不需要修改原始咖啡对象。这就是装饰器模式的应用。

最近发表
标签列表