`

【设计模式】装饰模式

 
阅读更多

装饰模式:

动态的将责任附加到对象上

对于扩展性而言,装饰模式比继承更具有弹性,因为装饰模式利用组合关系

关键地方

让装饰者与被装饰者实现同一个接口,或者继承同一个抽象类,目的是为了让它们具有统一的类型

类型统一了,方法就可以接收所有的子类型,然后在运行时动态绑定到具体的子类对象上

 

===》接口:让装饰者与被装饰者具有统一的类型

package pattern.decorator;

public interface Food {
	String description();
	double cost();
}

 

package pattern.decorator;

public abstract class AbstractFood implements Food {
	
	protected String description = "未知食物";
	
	public String description() {
		return description + "(" + cost() + ")";
	}
}	

 

===》被装饰者

package pattern.decorator;

public class Noodle extends AbstractFood {
	public Noodle() {
		this.description = "面条";
	}

	public double cost() {
		return 5.00;
	}
}

 

package pattern.decorator;

public class Dumpling extends AbstractFood {
	public Dumpling() {
		this.description = "饺子";
	}

	public double cost() {
		return 8.00;
	}
}

 

===》装饰者

package pattern.decorator;

public class Cayenne implements Food {
	
	Food food;
	
	public Cayenne(Food food) {
		this.food = food;
	}

	public double cost() {
		return food.cost() + extraFee();
	}
	
	private double extraFee() {
		return 1.00;
	}

	public String description() {
		return food.description() + " + 辣椒(" + extraFee() + ")";
	}

}

 

package pattern.decorator;

public class Parsley implements Food {
	
	Food food;
	
	public Parsley(Food food) {
		this.food = food;
	}

	public String description() {
		return food.description() + " + 香菜(" + extraFee() + ")";
	}

	public double cost() {
		return food.cost() + extraFee();
	}
	
	private double extraFee() {
		return 0.50;
	}

}

 

===》测试

package pattern.decorator;

import java.text.NumberFormat;

public class Test {
	public static void main(String[] args) {
		Food food = new Noodle();
		food = new Cayenne(food);//装饰
		food = new Parsley(food);//装饰
		food = new Parsley(food);//再装饰
		
		String desc = food.description();
		System.out.println(desc);
		
		double total = food.cost();
		String cost = NumberFormat.getCurrencyInstance().format(total);
		System.out.println(cost);
		
	}
}

 

 面条(5.0) + 辣椒(1.0) + 香菜(0.5) + 香菜(0.5)
¥7.00

 

分享到:
评论

相关推荐

    C++种设计模式 装饰模式.rar

    C++23种设计模式之 装饰模式。:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需 要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功 能),就会增加类的...

    设计模式装饰模式PPT学习教案.pptx

    设计模式装饰模式PPT学习教案 本资源摘要信息旨在对设计模式中的装饰模式进行详细的介绍和分析,涵盖了装饰模式的定义、结构、实现、应用实例等方面的内容。 一、装饰模式定义 装饰模式是一种用于替代继承的技术...

    设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)

    装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或职责,同时保持对象的接口不变。这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可...

    软件设计模式之装饰模式讲解

    软件设计模式之装饰模式讲解ppt,可用于教学课件。

    iOS 设计模式 装饰模式

    装饰模式是一种设计模式,主要目的是在不改变对象原有结构的情况下,动态地为对象添加新的功能。在iOS开发中,装饰模式被广泛应用于扩展类的功能,尤其是当需要在运行时为对象添加行为时,它提供了非常灵活的解决...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式通常用于保持对象的原始类结构不变,同时增强其功能。HeadFirst 设计模式系列书籍以其生动有趣的插图和...

    设计模式 - 装饰模式(C++实例)

    装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在软件工程中非常常见,因为它提供了灵活性,使得我们可以独立于对象的组合来扩展功能。 在C++中,装饰...

    java设计模式装饰模式有说明和结构图

    java代码 装饰着模式 文字说明 结构图 实例代码,不会的可以私信我

    23个设计模式之一的装饰ppt-java-极客学院

    装饰模式是一种结构型设计模式,它允许我们向一个对象动态地添加新的行为或属性,而无需修改原有对象的代码。这种模式在Java等面向对象语言中广泛应用,因为它提供了对类扩展的一种灵活方式,避免了使用继承带来的...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    54-Spring设计模式之装饰器模式1

    Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...

    java设计模式之装饰者模式代码

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展对象的功能,为对象提供新的行为,同时保持了代码的可读性和可维护...

    JAVA设计模式之装饰模式代码

    装饰模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。在Java中,装饰模式通常通过继承和组合来实现,提供了比子类化更灵活的方式来扩展对象的功能。 装饰模式的核心...

    设计模式之装饰者模式,内含可运行代码

    总的来说,装饰者模式是一种强大的设计模式,它提供了一种在运行时动态调整对象行为的方法,使得代码更具灵活性和可扩展性。通过理解和熟练运用装饰者模式,我们可以更好地应对软件需求的变化,提高代码的可维护性和...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    设计模式之装饰模式

    装饰模式是一种设计模式,它是结构型模式的一种,用于在运行时动态地给对象添加新的行为或职责。这种模式允许我们独立于对象的类来扩展其功能,而不必修改原有代码,实现了对对象的透明增强。装饰模式的核心在于,它...

    24种设计模式以及混合设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...

    RPG与设计模式(一)装饰模式 的源码

    文章“RPG与设计模式(一)装饰模式的源码”可能是通过一个角色扮演游戏(RPG)的场景来解释装饰模式的应用。RPG游戏通常涉及到多种角色和装备,这些装备可以为角色增加不同的属性,如攻击力、防御力等,这正是装饰...

    Java 经典设计模式讲解以及项目实战

    9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+策略+工厂方法 3 动态代理+Spring AOP 4 责任链模式进阶 Spring Framework设计模式 ...

Global site tag (gtag.js) - Google Analytics