装饰着模式

package com.henu.Decorator;
/**
 * 汉堡基类
 * @author rock
 */
public abstract class Humburger {
	  protected  String name;    
	  public String getName(){    
	       return name;    
	  }    
	  public abstract double getPrice();    
}
package com.henu.Decorator;
/**
 * 鸡腿堡类(被装饰者的初始状态,有些自己的简单装饰,相当于上面的Person)
 * @author rock
 */
public class ChickenBurger extends Humburger{

	@Override
	public double getPrice() {
		// TODO Auto-generated method stub
		return 10.0;
	}
	public ChickenBurger(){    
        name = "鸡腿堡";    
    } 
} package com.henu.Decorator;
/**
 * 配料的基类(装饰者,用来对汉堡进行多层装饰,每层装饰增加一些配料,相当于上面Decorator)
 * @author rock
 *
 */
public abstract class Condiment extends Humburger{
	public abstract String getName();
}
package com.henu.Decorator;
/**
 * 生菜(装饰者的第一层,相当于上面的decorator_zero)
 * @author rock
 *
 */
public class Lettuce extends Condiment{
	Humburger humburger;
	public Lettuce(Humburger humburger){
		this.humburger = humburger;
	}
	@Override
	public String getName() {
		return humburger.getName();
	}

	@Override
	public double getPrice() {
		return humburger.getPrice()+1.5;
	}
}

package com.henu.Decorator;
/**
 * 辣椒(装饰者的第二层)
 * @author rock
 *
 */
public class Chilli extends Condiment{
	Humburger humburger;    
    public Chilli(Humburger humburger){    
        this.humburger = humburger;    
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return humburger.getName()+"+辣椒";
	}

	@Override
	public double getPrice() {
		// TODO Auto-generated method stub
		return humburger.getPrice(); //辣椒是免费的
	}

} public class Test {
	public static void main(String[] args) {
		 Humburger humburger = new ChickenBurger();    
	     System.out.println(humburger.getName()+"  价钱:"+humburger.getPrice());    
	     Lettuce lettuce = new Lettuce(humburger);    
	     System.out.println(lettuce.getName()+"  价钱:"+lettuce.getPrice());    
	     Chilli chilli = new Chilli(humburger);    
	     System.out.println(chilli.getName()+"  价钱:"+chilli.getPrice());    
	     Chilli chilli2 = new Chilli(lettuce);    
	     System.out.println(chilli2.getName()+"  价钱:"+chilli2.getPrice());    
	}
}


鸡腿堡  价钱:10.0
鸡腿堡  价钱:11.5
鸡腿堡+辣椒  价钱:10.0
鸡腿堡+辣椒  价钱:11.5

### 装饰模式在星巴克咖啡下单系统中的实现 装饰模式的核心在于动态地为对象添加额外的功能,而不改变其原有的结构。以下是基于装饰模式的一个典型实现案例,用于模拟星巴克咖啡订单系统。 #### 1. 基本概念与角色定义 在装饰模式中,主要涉及以下几个部分: - **Component**: 定义接口或抽象类,表示可以被装饰的对象。 - **Concrete Component**: 实现了 `Component` 接口的具体对象。 - **Decorator**: 继承自 `Component` 的基类,负责动态地给这些对象添加职责。 - **Concrete Decorator**: 扩展了 `Decorator` 类并实现了具体的附加功能[^1]。 对于星巴克咖啡下单系统来说: - Coffee 是组件(Component),代表所有的饮品。 - SimpleCoffee 是具体组件(Concrete Component),比如美式咖啡。 - MilkDecorator 和 SugarDecorator 是具体装饰器(Concrete Decorator),分别表示加牛奶和加糖的行为。 --- #### 2. 核心代码实现 下面是一个简单的 Java 示例,展示如何利用装饰模式构建星巴克咖啡订单系统: ```java // 抽象组件:定义统一的接口 interface Coffee { String getDescription(); // 获取描述 double getCost(); // 计算价格 } // 具体组件:基础咖啡 class SimpleCoffee implements Coffee { @Override public String getDescription() { return "Simple Coffee"; } @Override public double getCost() { return 10; // 美元 } } // 抽象装饰器:提供通用的装饰逻辑 abstract class CoffeeDecorator implements Coffee { protected final Coffee decoratedCoffee; public CoffeeDecorator(Coffee c) { this.decoratedCoffee = c; } @Override public String getDescription() { return decoratedCoffee.getDescription(); } @Override public double getCost() { return decoratedCoffee.getCost(); } } // 具体装饰器:增加牛奶 class MilkDecorator extends CoffeeDecorator { public MilkDecorator(Coffee c) { super(c); } @Override public String getDescription() { return super.getDescription() + ", with milk"; // 添加新特性到描述 } @Override public double getCost() { return super.getCost() + 2; // 加价 $2 } } // 具体装饰器:增加糖分 class SugarDecorator extends CoffeeDecorator { public SugarDecorator(Coffee c) { super(c); } @Override public String getDescription() { return super.getDescription() + ", with sugar"; // 添加新特性到描述 } @Override public double getCost() { return super.getCost() + 1; // 加价 $1 } } ``` --- #### 3. 使用示例 假设客户想要一杯加入牛奶和糖的基础咖啡,则可以通过如下方式创建对象链: ```java public class Main { public static void main(String[] args) { // 创建基本咖啡 Coffee myCoffee = new SimpleCoffee(); System.out.println(myCoffee.getDescription()); // 输出: Simple Coffee System.out.println("Price: $" + myCoffee.getCost()); // 输出: Price: $10 // 动态添加牛奶 myCoffee = new MilkDecorator(myCoffee); System.out.println(myCoffee.getDescription()); // 输出: Simple Coffee, with milk System.out.println("Price: $" + myCoffee.getCost()); // 输出: Price: $12 // 再次动态添加糖 myCoffee = new SugarDecorator(myCoffee); System.out.println(myCoffee.getDescription()); // 输出: Simple Coffee, with milk, with sugar System.out.println("Price: $" + myCoffee.getCost()); // 输出: Price: $13 } } ``` 上述代码展示了如何通过逐步叠加的方式扩展咖啡的功能,而无需修改原始的 `SimpleCoffee` 类[^4]。 --- #### 4. 性能注意事项 尽管装饰模式提供了极大的灵活性,但也可能带来一定的性能开销。这是因为每次调用装饰器对象的方法时,都会间接调用被装饰对象的方法,这可能导致更多的函数调用栈层次[^3]。因此,在实际开发过程中需权衡复杂性和效率之间的关系。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值