关闭

设计模式之---装饰者模式

标签: 接口JAVAuml装饰者模式设计模式
205人阅读 评论(0) 收藏 举报
分类:
装饰者模式的简单理解:

一、定义
装饰者模式包含超类,模具类,装饰者类。
模具类和装饰者类继承超类。
装饰者类组合了模具类或者包含模具类的装饰者类对象,适用于计算可能会随时更新的类型值的累积计算问题。


二、实现

例如:
超类:饭。
模具类:炒饭。
装饰者抽象类:调料。
装饰者子类:蛋。

现在我出去想要吃炒饭。
我什么都不想加,只想吃炒饭,所以,炒饭有自己的价格。

然后某天我吃腻了,我现在吃炒饭需要加蛋,那么,蛋作为调料,就是一个装饰者。


有人会说,不就是加个蛋,我在炒饭这个类里加个方法,接收加入蛋的个数,和单价不就行了,没必要搞装饰者这么麻烦。

首先,这里说修改炒饭这个类里的代码,就已经违反了OO原则(开闭原则:对修改关闭,对扩展开放。就是说,当新的需求出现时,不要修改原先有的代码,而是应该新增代码)

所以,这里不能在原先有的代码里作修改,应该怎么做呢?通过继承装饰者类,就可以达到目的。

前面的定义说过,装饰者类组合了模具类,所以在蛋类中,应该有模具类的对象,可是,这里又来了问题:直接在蛋类中加入炒饭类的对象么?
答案是:错。
试想:如果这样做了,那么以后每次你的蛋就只能放入到炒饭中了,但是蛋还是可以放入到其他的诸如稀饭,白米饭中的。
所以这里需要利用JAVA的特性,多态来解决问题。
在装饰者类中加入超类的接口。为什么这样做呢,因为模具类和装饰者类都继承超类。

这样,就完成了装饰者模式的设计。
以后如果想要给炒饭加其他的调料,诸如:火腿肠,那么只要增加火腿肠这个类,并继承装饰者类就可以了。
而且,如果以后不想做炒饭了,想要扩展业务,做稀饭,做白米饭。
那么也只需要多添加两个模具类就可以了。

三、总结:

装饰者模式使得代码的开发可以很好的遵循OO原则,让程序具有更加灵活的扩展性。



package test;

/**
 * 饭(超类)
 *
 */
abstract class Rice{
	public abstract double cost();
}

/**
 * 调料(装饰者)
 *
 */
abstract class Seasoning extends Rice{
	
}

/**
 * 炒饭(模具类)
 *
 */
class FryRice extends Rice{
	@Override
	public double cost() {
		return 5;//假设炒饭5块钱
	}
}

/**
 * 鸡蛋(装饰者)
 *
 */
class Egg extends Seasoning{
	Rice r;
	Egg(Rice r){
		this.r=r;
	}
	
	@Override
	public double cost() {
		return r.cost()+1;//假设鸡蛋1块钱
	}
	
}

/**
 * 火腿肠(装饰者)
 *
 */
class Sausage extends Seasoning{
	Rice r;
	Sausage(Rice r){
		this.r=r;
	}
	
	@Override
	public double cost() {
		return r.cost()+2;//假设火腿肠2块钱
	}
	
}

public class practice {
	public static void main(String[] args) {
		Rice r=new FryRice();//先弄炒饭5块
		r=new Egg(r);//再加个鸡蛋1块
		r=new Sausage(r);//再加个火腿肠2块
		
		System.out.println(r.cost());//一共八块
	}
}

输出结果:8.0

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4132次
    • 积分:150
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档