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

另外我每次都会提供源码的下载,如果有错希望大家指出来一起交流,下面这个是源码下载地址:
http://download.youkuaiyun.com/user/chenwill3
我个人觉得这种设计模式更像一条链子,我们来看一个这样的例子:我们的生活离不开茶,随着时代的发展,我们的生活变得越来越好,每次喝茶我们都会向里面加一些东西如“白糖”,“牛奶”,“椰果”之类的东西,但是茶的种类不止一种,有什么红茶,碧螺春,普洱,龙井之类。茶是动态变化的,茶的添加物也是一样。这就是装饰模式(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
理解装饰(Decorator)模式:动态增强对象功能
本文深入探讨装饰(Decorator)模式,一种动态地给对象添加额外职责的设计模式。通过实例展示了如何使用装饰模式实现动态功能扩展,避免类的过度复杂化。
1240

被折叠的 条评论
为什么被折叠?



