装饰(Decorator)模式

理解装饰(Decorator)模式:动态增强对象功能
本文深入探讨装饰(Decorator)模式,一种动态地给对象添加额外职责的设计模式。通过实例展示了如何使用装饰模式实现动态功能扩展,避免类的过度复杂化。

装饰(Decorator)模式也是设计模式中的一颗璀璨的星星,它使我们的程序变得灵活。好了下面来看一下装饰(Decorator)模式的介绍吧。

装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。装饰模式是为已有功能动态地添加更多功能的一种方式。
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新的代码通常装饰了原有的核心职责或主要行为。如果在主类中添加新的字段、行为和逻辑,将增加类的复杂度;而装饰模式,通过继承主类,把每个要装饰的功能放到单独的子类中。
把装饰功能从主类中移除,有效地把类的核心职责和装饰功能分开,去除了相关类的重复的装饰逻辑,简化了主类。
我个人觉得这种设计模式更像一条链子,我们来看一个这样的例子:我们的生活离不开茶,随着时代的发展,我们的生活变得越来越好,每次喝茶我们都会向里面加一些东西如“白糖”,“牛奶”,“椰果”之类的东西,但是茶的种类不止一种,有什么红茶,碧螺春,普洱,龙井之类。茶是动态变化的,茶的添加物也是一样。这就是装饰模式(Decorator)的一个小例子。怎么将这种效果体现出来呢?下面我们就来做一下吧!

1.设计一个abstract类,里面有一个方法获取对茶或者添加物的描述,并且写一个抽象的cost()方法。
package org.lxh.dao;

public abstract class Tea {
	protected String description="未知";

	public String getDescription() {
		//System.out.println("Tea这个类被执行");
		return description;
	}

	public abstract int cost();

}

2.茶的种类很多,我们来写几种茶看看

package org.lxh.impl;

import org.lxh.dao.Tea;

public class GreenTea extends Tea {
	public GreenTea() {
		description = "GreenTea";
	}

	public int cost() {

		return 3;   //没有加调料的绿茶3元一杯
	}

}

package org.lxh.impl;

import org.lxh.dao.Tea;

public class BlackTea extends Tea {
	public BlackTea() {
		description = "BlackTea";
	}

	public int cost() {
      
		return 2;    //没加调料的红茶2元一杯
	}

}

3.写一个调料类,让它继承Tea
package org.lxh.impl;

import org.lxh.dao.*;

/*首先必须让CondimentDecorator能够取代Tea,
 所以让CondimentDecorator继承Tea*/
public abstract class CondimentDecorator extends Tea {
	public abstract String getDescription();

}

4.我们来写一下有关调料的代码
package org.lxh.impl;

import org.lxh.dao.Tea;

public class Milk extends CondimentDecorator {
	Tea t;

	public Milk(Tea t) {
		this.t = t;
	}

	public String getDescription() {

		return t.getDescription() + ",milk";

	}

	public int cost() {

		return 4 + t.cost();
	}

}


package org.lxh.impl;

import org.lxh.dao.Tea;

public class Coconut extends CondimentDecorator{
	Tea t;
    public Coconut(Tea t)
    {
    	this.t=t;
    }
	public String getDescription() {
	    
		return t.getDescription()+",Coconut";
	}

	public int cost() {
        
		return 1+t.cost();
	}

}

4.写一个测试类查看效果
package test;

import org.lxh.dao.Tea;
import org.lxh.impl.Coconut;
import org.lxh.impl.Milk;
import org.lxh.impl.BlackTea;

public class Test {

	public static void main(String[] args) {
		System.out.println("茶里没有添加配料");
		Tea t1 = new BlackTea();
		System.out.println(t1.getDescription() + "," + t1.cost());

		System.out.println("向茶里添加2种配料");
		Tea t2 = new BlackTea();
		t2 = new Milk(t2);
		t2 = new Coconut(t2);
		System.out.println(t2.getDescription() + "," + t2.cost());

	}

}

下面是运行效果图,有疑问的可以问我。


另外我每次都会提供源码的下载,如果有错希望大家指出来一起交流,下面这个是源码下载地址:

http://download.youkuaiyun.com/user/chenwill3

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值