Java设计模式——装饰者设计模式

1.什么是装饰者设计模式

  在不改变原类文件和使用继承的基础上,动态的给对象增添某些功能或行为。

2.为什么要使用装饰着设计模式

  在面向对象的开发中,要实现给类或对象增加行为或功能,可以使用继承。但是,如果要给一个已经初始化的对象增添某些功能或行为,这是继承完成不了的;如果要继承许多类的功能或行为,使用继承生成子类进行扩充,这样可能有大量的扩展,为支持每一种组合将产生大量的子类,这将产生非常可怕的事情——类爆炸。但是,装饰者设计模式可以完美的解决上述的两个情况,装饰者设计模式在不改变原类文件和使用继承的基础上,动态的为对象添加某些功能或行为。

3.装饰者设计模式的适用范围  

  a.在不影响其他对象的同时,为某个对象动态、透明地增添一些职能。

  b.处理那些可以撤销的职责。

  c.当不能采用生成子类的方法进行扩充时。

      <1>如果要继承许多类的功能或行为,使用继承生成子类进行扩充的话可能会有大量的扩展,为支持每一种组合将产生大量的子类,会产生类爆炸。

      <2>类定义被隐藏或者不允许修改

4.装饰者设计模式的组成

  a.抽象组件角色:定义一个对象接口,以规范准备接受附加职能的对象。

  b.具体组件角色:被装饰者。

  c.抽象装饰器:装饰者。

  d.具体装饰器:向具体组件添加职能。

5.装饰者设计模式的UML图


6.装饰者设计模式的特点

    (1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
  (2) 装饰对象包含一个真实对象的索引(reference)

  (3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。

  (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

7.代码示例

(1)Drink.java

package codingke.decorator;

public interface Drink {
	
	public String description();
	
	public float cost();
	
}

<2>SoyaBeanMilk.java

package codingke.decorator;

public class SoyaBeanMilk implements Drink{
	@Override
	public String description() {
		return "纯豆浆";
	}
	
	@Override
	public float cost() {
		return 3f;
	}
	
}

<3>Decorator.java

package codingke.decorator;

public class Decorator implements Drink{
	
	private Drink drink;
	
	public Decorator(Drink drink) {
		super();
		this.drink = drink;
	}

	@Override
	public String description() {
		return drink.description();
	}
	
	@Override
	public float cost() {
		return drink.cost();
	}
	
}

<4>SugarDecorator.java

package codingke.decorator;

public class SugarDecorator extends Decorator{

	public SugarDecorator(Drink drink) {
		super(drink);
	}

	@Override
	public String description() {
		return super.description()+"+糖";
	}
	
	@Override
	public float cost() {
		return super.cost()+0.5f;
	}
}

<5>BlackBeanDecorator.java

package codingke.decorator;

public class BlackBeanDecorator extends Decorator{

	public BlackBeanDecorator(Drink drink) {
		super(drink);
	}
	
	@Override
	public String description() {
		return super.description()+"+黑豆";
	}

	@Override
	public float cost() {
		return super.cost()+1.0f;
	}
	
}

<6>EggDecorator.java

package codingke.decorator;

public class EggDecorator extends Decorator{

	public EggDecorator(Drink drink) {
		super(drink);
	}

	@Override
	public String description() {
		return super.description()+"+鸡蛋";
	}
	
	@Override
	public float cost() {
		return super.cost()+2.0f;
	}
}

<7>Guest.java

package codingke.decorator;

public class Guest {

	public static void main(String[] args) {
		
		Drink drink = new SoyaBeanMilk();
		SugarDecorator sugar = new SugarDecorator(drink);
		BlackBeanDecorator blackBean = new BlackBeanDecorator(sugar);
		EggDecorator egg = new EggDecorator(blackBean);
		System.out.println("客人的订单:"+egg.description());
		System.out.println("客人消费的金额:"+egg.cost());
	}

}









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰者模式是一种结构型设计模式,它允许你动态地向对象添加行为。通过将对象放入装饰器类中,可以在运行时更改对象的行为。 在咖啡馆中,装饰者模式可以用于根据顾客的选择动态地添加配料并计算价格。我们可以创建一个基础咖啡类,然后创建多个装饰器类来添加不同的配料,并且每个装饰器类都可以计算自己的价格。 下面是一个简单的示例代码: ```java // 基础咖啡类 public abstract class Coffee { protected String description = "Unknown coffee"; public String getDescription() { return description; } public abstract double cost(); } // 浓缩咖啡类 public class Espresso extends Coffee { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } } // 装饰器类,用于添加牛奶 public class Milk extends Coffee { private Coffee coffee; public Milk(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Milk"; } public double cost() { return coffee.cost() + 0.5; } } // 装饰器类,用于添加摩卡 public class Mocha extends Coffee { private Coffee coffee; public Mocha(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Mocha"; } public double cost() { return coffee.cost() + 0.8; } } // 测试代码 public static void main(String[] args) { Coffee coffee = new Espresso(); // 创建一个浓缩咖啡 coffee = new Milk(coffee); // 添加牛奶 coffee = new Mocha(coffee); // 添加摩卡 System.out.println(coffee.getDescription() + " $" + coffee.cost()); } ``` 输出结果为:`Espresso, Milk, Mocha $3.29` 在这个例子中,我们创建了一个基础咖啡类 `Coffee`,并且创建了两个装饰器类 `Milk` 和 `Mocha`。我们可以通过创建不同的装饰器来添加不同的配料。最后,我们创建了一个浓缩咖啡对象 `Espresso`,并且动态地添加了牛奶和摩卡,最终计算出了价格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值