设计模式之装饰者模式

1、装饰者模式的定义

      在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

2、装饰者模式的适用场景
     1> 需要动态的给一个对象添加功能,这些功能可以再动态的撤销
     2> 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实
     3> 当不能采用生成子类的方法进行扩充时

3、装饰者模式的类图形式:


4、装饰者模式的具体实现:


例如:要做一个饼并且声明是手抓饼,需要在手抓饼里面添加其他的材料例如牛肉、鸡蛋、生菜等等。。。此时饼就是一个被装饰者的抽象父类,对应类图中的接口,这个抽象父类包含其下具体的实现子类的一些共有的属性方法,饼分为很多种,此时手抓饼就是该抽象父类的一个具体的实现子类,也是被装饰者。而牛肉、鸡蛋这些就是装饰者,用来装饰这个手抓饼,类图中被装饰者与装饰者之间存在关联关系,就是通过装饰者的父类与实现被装饰者的父类实现的,这些具体的实体类就好比牛肉鸡蛋。

代码实现如下:

package DecoratorModel;
/**
 * 被装饰者的抽象父类
 *
 */
public interface Cake {
	public float price();
	public String description();
}
package DecoratorModel;
/**
 * 被装饰者的实体类(手抓饼)
 *
 */
public class GraspCake implements Cake{
	public float price() {
		return 3.0f;
	}
	public String description() {
		return "您点了一个原味手抓饼";
	}
}

package DecoratorModel;
/**
 * 装饰着的父类
 *
 */
public abstract class Decorator implements Cake{
	//体现和被装饰者的关联关系
	private Cake cake;
	public Decorator(Cake cake){
		this.cake = cake;
	}
	public float price() {
		return cake.price();
	}
	public String description() {
		return cake.description();
	}
}

package DecoratorModel;

public class BeefDecorator extends Decorator{
	public BeefDecorator(Cake cake) {
		super(cake);
	}
	public float price() {
		return super.price()+2.0f;
	}
	public String description() {
		return super.description()+"+牛排";
	}
	
	public void test2(){
		System.out.println("测试2");
	}
}

package DecoratorModel;
/**
 * 装饰着的具体实体类
 *
 */
public class EggDecorator extends Decorator{
	public EggDecorator(Cake cake) {
		super(cake);
	}
	public float price() {
		return super.price()+1.5f;
	}
	public String description() {
		return super.description()+"+鸡蛋";
	}
	
	public void test(){
		System.out.println("鸡蛋装饰测试函数");
	}
}

package DecoratorModel;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;

public class Test {
	public static void main(String[] args) {
		InputStream ins;
		InputStream fis = new FileInputStream();
		InputStream ois = new ObjectInputStream(fis);
		InputStream dis = new DataInputStream(ois);
		
		Cake gc = new GraspCake();
		
		Cake ed = new EggDecorator(gc);
		
		
		
		Cake bf = new BeefDecorator(gc);
		
		System.out.println(bf.price());
		System.out.println(bf.description());
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值