设计模式之装饰者模式

**装饰者模式目标**

把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活

装饰者模式角色

  • 抽象组件角色

给出一个抽象接口

  • 具体组件角色

定义一个将要增加附加功能的类,相当于父类

  • 抽象装饰者角色

持有一个组件对象的实例,并且实现抽象组件接口

  • 具体装饰者角色

负责给组件对象添加附加的功能,相当于子类

装饰者模式示例

以一件商品被卖出为例,

//抽象组件角色 Commodity.java
public interface Commodity {

	public void beSoldOut();
}


//具体组件角色
public class Book implements Commodity {

	@Override
	public void beSoldOut() {
		System.out.println("书被卖出去了");
	}
}



//抽象装饰者角色 Decorator.java
//实现了抽象组件接口
public abstract class Decorator implements Commodity {

	Commodity commodity; //持有组件对象的实例
	
	Decorator(Commodity commodity){
		this.commodity=commodity;
	}
	@Override
	public void beSoldOut() {
		commodity.beSoldOut();
	}

}



//具体装饰者角色:增加了折扣的功能 DiscountDecorator.java
public class DiscountDecorator extends Decorator {

	public DiscountDecorator(Commodity commodity) {
		super(commodity);
	}

	public void discount(){
		System.out.println("再送一件相同的商品");
	}
	@Override
	public void beSoldOut() {
		// TODO Auto-generated method stub
		super.beSoldOut();
		discount();
	}

}



//具体装饰者角色:再次折扣促销  DiscountAgainDecorator.java 
public class DiscountAgainDecorator extends Decorator {

	
	public DiscountAgainDecorator(Commodity commodity){
		super(commodity);
	}
	
	public void discountAgain(){
		System.out.println("再送一件价格低一点的商品");
	}
	
	@Override
	public void beSoldOut() {
		super.beSoldOut();
		discountAgain();
	}
}


//客户端测试类 testDecorator.java

public class testDecorator {

	public void static main(String[] args) {
		Commodity book = new Book();
		Decorator decorator = new DiscountAgainDecorator(new DiscountDecorator(book));
		decorator.beSoldOut();
	}
}


测试结果是

书被卖出去了
再送一件相同的商品
再送一件价格低一点的商品

原文地址:https://www.cnblogs.com/sweiqi/p/6111816.html