设计模式—装饰者模式

通过继承实现子类的行为是在编译时静态决定的,而且所有子类都会继承到相同的行为;而组合可以在运行时动态的进行扩展,所以应该尽量利用组合的方法扩展对象的行为。运行时的扩展远比编译时期的继承威力大

    1  装饰者和被装饰者必须是一样的类型,即具有共同的超类。
    2  当我们将装饰者与组件组合时,就是在加入新的行为。
    3  java I/O中使用了大量的装饰类
    4  装饰者模式符合开放——关闭模式:允许扩展,但是不允许修改代码。


//超类
package com.quding.mode;

public abstract class Beverage {
	private String description = "unknown description";
	
	public String getDescription(){
		return description;
	}
	
	public abstract double cost();
}
//装饰者超类
package com.quding.mode;

public abstract class Decorator extends Beverage{

	public abstract String getDescription();
}


//具体的子类:

package com.quding.mode;

public class Coffee1 extends Beverage{

	@Override
	public double cost() {
		return 2.0;    //coffee1 价格2元
	}

	@Override
	public String getDescription() {
		return "coffee1";
	}
}


//子类2
package com.quding.mode;

public class Coffee2 extends Beverage{

	@Override
	public double cost() {
		return 4.0;    //coffee2 价格4元
	}

	@Override
	public String getDescription() {
		return "coffee2";
	}
}

 装饰者子类:

package com.quding.mode;

public class MilkDecorator extends Decorator {

	private Beverage mBeverage;

	public MilkDecorator(Beverage mBeverage) {
		super();
		this.mBeverage = mBeverage;
	}

	@Override
	public String getDescription() {
		return mBeverage.getDescription() + " , milk";
	}

	@Override
	public double cost() {
		return mBeverage.cost() + 1;   //加牛奶一元
	}
}


//子类2
package com.quding.mode;

public class SugarDecorator extends Decorator {

	private Beverage mBeverage;

	public SugarDecorator(Beverage mBeverage) {
		super();
		this.mBeverage = mBeverage;
	}

	@Override
	public String getDescription() {
		return mBeverage.getDescription() + " , sugar";
	}

	@Override
	public double cost() {
		return mBeverage.cost() + 2;   //加糖二元
	}
}

 测试代码:

package com.quding.mode;

public class MainTest {
	public static void main(String[] args) {
		System.out.println("要一份加糖的种类为coffee1的咖啡:");
		Beverage beverage = new SugarDecorator(new Coffee1());
		System.out.println("种类 : " + beverage.getDescription() + "\n价格 : "
				+ beverage.cost());

		System.out.println("要一份加糖加两份牛奶的种类为coffee2的咖啡:");
		beverage = new SugarDecorator(new MilkDecorator(new MilkDecorator(
				new Coffee2())));
		System.out.println("种类 : " + beverage.getDescription() + "\n价格 : "
				+ beverage.cost());
	}
}

 

总结:以上简单的几个类体现了装饰者模式的精髓。以后当使用继承时要考虑能否使用装饰者代替,扩展代码的弹性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰者模式是一种结构型设计模式,它允许将行为动态地添加到一个对象中,同时又不改变其原有的实现。装饰者模式通过创建一个包装对象,将原始对象进行包装,从而在运行时动态地添加新的功能。 在 JavaScript 中,装饰者模式可以通过对象扩展、类继承或者函数包装等方式来实现。下面以对象扩展为例进行说明: ```javascript // 定义一个基础组件类 class Component { operation() { return "基础功能"; } } // 定义一个装饰者类 class Decorator { constructor(component) { this.component = component; } operation() { return `${this.component.operation()},附加装饰功能`; } } // 使用示例 const component = new Component(); console.log(component.operation()); // 输出:基础功能 const decoratedComponent = new Decorator(component); console.log(decoratedComponent.operation()); // 输出:基础功能,附加装饰功能 ``` 在上面的示例中,`Component` 是基础组件类,`Decorator` 是装饰者类,它接收一个 `Component` 对象作为参数,并在其 `operation` 方法中调用原始对象的 `operation` 方法,并添加了额外的功能。 通过使用装饰者模式,我们可以动态地增加、组合和删除功能,而无需修改现有的代码。这种扩展性和灵活性使得装饰者模式在一些场景下非常有用,比如在不破坏原有类结构的情况下,对现有对象进行功能增强或行为修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值