Java IO 流 -- 设计模式:装饰设计模式

在java IO 流中我们经常看到这样的写法:

ObjectOutputStream oos = new ObjectOutputStream(
				new BufferedOutputStream(new FileOutputStream("obj.ser")));

这其实就是IO流使用装饰设计模式,装饰设计模式通常包含:
1、抽象的组件(抽象类或接口)
2、具体的组件:需要装饰的对象
3、抽象的装饰:包含了对抽象组件的引用以及装饰着共同的方法
4、具体的装饰类:被装饰的对象
下面模拟咖啡用装饰模式,直接上完整代码:

package com.xzlf.io;

/**
 * 模拟咖啡
 * 1、抽象的组件(抽象类或接口)
 * 2、具体的组件:需要装饰的对象
 * 3、抽象的装饰:包含了对抽象组件的引用以及装饰着共同的方法
 * 4、具体的装饰类:被装饰的对象
 * @author xzlf
 *
 */
public class DecorateTest02 {
	public static void main(String[] args) {
		Drink coffe = new Coffe();
		Drink milk = new Milk(coffe);
		System.out.println(milk.info() + "-->" + milk.cost());
		Drink suger = new Suger(coffe);
		System.out.println(suger.info() + "-->" +suger.cost());
		suger = new Suger(milk);
		System.out.println(suger.info() + "-->" +suger.cost());
	}
}

/* 抽象组件 */
interface Drink{
	double cost();// 费用
	String info();// 说明
	
}

/* 具体组件 */
class Coffe implements Drink{
	private String name = "原味咖啡";

	@Override
	public double cost() {
		return 10;
	}

	@Override
	public String info() {
		return name;
	}
	
}

/* 抽象的装饰类 */
abstract class Decorate implements Drink{
	private Drink drink;
	
	public Decorate(Drink drink) {
		this.drink = drink;
	}
	
	@Override
	public double cost() {
		return drink.cost();
	}
	
	@Override
	public String info() {
		return drink.info();
	}
}

/* 具体的装饰类 */
class Milk extends Decorate{

	public Milk(Drink drink) {
		super(drink);
	}
	
	@Override
	public double cost() {
		return super.cost()*10;
	}
	
	@Override
	public String info() {
		return super.info() + "加入了牛奶";
	}
}

/* 具体的装饰类 */
class Suger extends Decorate{

	public Suger(Drink drink) {
		super(drink);
	}
	
	@Override
	public double cost() {
		return super.cost()*2;
	}
	
	@Override
	public String info() {
		return super.info() + "加入了蔗糖";
	}
}

运行测试:
在这里插入图片描述

posted @ 2020-03-29 16:36  行者老夫  阅读(427)  评论(0编辑  收藏  举报