14、装饰者模式

14、装饰者模式

IO常用类体系在这里插入图片描述

装饰者模式

意图
动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活。该模式以对客户端透明的方法扩展对象的功能。
适用环境
在不影响前台对象的情况下,以动态、透明的方法给单个对象添加职责
处理那些可以撤销的职责
当不能采用生成子类的方法进行扩充时,一种情况是。可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长,另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类

类图
Component(被装饰对象基类)
定义对象的接口,可以给这些对象动态增加职责
ConreteComponent(具体被装饰对象)
定义具体的对象,Decorator可以给他增加额外的职责
Decorator(装饰者抽象类)
维护指向Component实例的引用,定义与Compontent一致的接口;
ConcreteDecorator(具体装饰者)
具体的装饰者对象,给内部持有的具体被装饰对象增加具体的职责

例:卖豆浆
主料:‘豆浆
辅料:糖、黑豆
在这里插入图片描述

创建一个接口

//装饰者接口
public interface Drink {
		float cost();//计算价格
		String description();//描述
	}

//装饰者的基类
public abstract class Decorator implements Drink {
	private Drink drink;//要装饰的对象
	public Decorator(Drink drink) {
		this.drink=drink;
	}

	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return drink.cost();
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return drink.description();
	}

}
/*
 * 具体的装饰者类
 */
public class SugarDecrartor extends Decorator {

	public SugarDecrartor(Drink drink) {
		super(drink);
		// TODO Auto-generated constructor stub
	}
	public float cost() {
		return super.cost()+1.0f;
	}
	@Override
	public String description() {
		// TODO Auto-generated method stub
		return super.description()+"+糖";
	}

}

/*
 * 具体的装饰者类
 */

public class BlackBeanDecorator extends Decorator {

	public BlackBeanDecorator(Drink drink) {
		super(drink);
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return super.cost()+2.0f;
	}
	@Override
	public String description() {
		// TODO Auto-generated method stub
		return super.description()+"+黑豆";
	}

}

/*
 * 具体的装饰者类
 */

public class EggDecorator extends Decorator {

	public EggDecorator(Drink drink) {
		super(drink);
		// TODO Auto-generated constructor stub
	}
	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return super.cost()+1.0f;
	}
	@Override
	public String description() {
		// TODO Auto-generated method stub
		return super.description()+"+鸡蛋";
	}

}

import java.io.PrintStream;

public class test {

	public static void main(String[] args) {
		
		//OutputStream out=new OutputStream("```");
		//BufferedOutputStream bos=new BufferedOutputStream(out);
		//PrintStream ps=new PrintStream(bos);
		//ps.print(111);
		

		Drink drink=new SoyaBeanMilk();
		SugarDecrartor suger=new SugarDecrartor(drink);
		EggDecorator egg=new EggDecorator(suger);
		BlackBeanDecorator blackBean=new BlackBeanDecorator(egg);
		System.out.println("你点的豆浆是:"+blackBean.description());
		System.out.println("共花费了"+blackBean.cost()+"元");
		
	}

你点的豆浆是:纯豆浆+糖+鸡蛋+黑豆
共花费了14.0元
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值