JAVA 装饰者模式 (从现实生活角度理解代码原理)
这里有新鲜出炉的 Java 设计模式, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
装饰者模式可以动态地给一个对象添加一些额外的职责就增加功能来说, Decorator 模式相比生成子类更为灵活这篇文章主要介绍了 JAVA 装饰者模式的相关资料, 需要的朋友可以参考下
装饰者模式可以动态地给一个对象添加一些额外的职责就增加功能来说, Decorator 模式相比生成子类更为灵活
该模式的适用环境为:
(1)在不影响其他对象的情况下, 以动态透明的方式给单个对象添加职责
(2)处理那些可以撤消的职责
(3)当不能采用生成子类的方法进行扩充时一种情况是, 可能有大量独立的扩展, 为支持每一种组合将产生大量的子类, 使得子类数目呈爆炸性增长另一种情况可能是因为类定义被隐藏, 或类定义不能用于生成子类
实现该模式的关键步骤:
(1)Component(被装饰对象基类): 定义对象的接口, 可以给这些对象动态增加职责;
(2)ConcreteComponent(具体被装饰对象): 定义具体的对象, Decorator 可以给它增加额外的职责;
(3)Decorator(装饰者抽象类): 维护指向 Component 实例的引用, 定义与 Component 一致的接口(也就是要继承或实现被装饰对象基类);
(4)ConcreteDecorator(具体装饰者): 具体的装饰对象, 给内部持有的具体被装饰对象增加具体的职责;
这样讲大家可能有些不好理解, 那我们还是老规矩安静:
入冬以后天气越来越冷了, 下班之后, 做为资深吃货, 约上二三好友痛快的来场火锅盛宴再爽不过了说到火锅, 不得不提在成都吃过的大龙燚火锅, 各种锅底, 配菜应有尽有, 但我最喜欢的还是大龙燚火锅原味锅底麻辣牛肉大刀毛肚天味香肠砣砣牛肉麻辣排骨等, 想想都流口水啊
说道这大家结合装饰者的实现步骤, 应该有点感觉了吧, 上文提到的锅底, 其实就是被装饰对象的基类, 配料其实就是装饰者抽象类, 大龙燚火锅原味锅底这些具体的锅底也就是具体的被装饰对象了, 麻辣牛肉大刀毛肚天味香肠砣砣牛肉麻辣排骨这些装饰锅底用的各种配菜也就是具体的装饰对象说道这, 大家应该都豁然开朗了吧, 下面我们开始具体的代码实现:
第一步: 定义被装饰对象基类(可以是抽象类也可以是接口)
- public interface GuoDi {
- public float cost(); // 锅底当然要有价钱啦
- public String name(); // 名字也得有哦
- }
第二步: 定义具体被装饰对象(也就是各种锅底, 这里定义两种)
- public class YuanYang implements GuoDi {
- @Override
- public float cost() {
- return 48.0f;
- }
- @Override
- public String name() {
- return "鸳鸯锅底";
- }
- }
- public class DaLongYan implements GuoDi{
- @Override
- public float cost() {
- return 59.0f;
- }
- @Override
- public String name() {
- return "大龙燚火锅原味锅底";
- }
- }
第三步: 定义装饰者抽象类
- public abstract class PeiCai implements GuoDi {
- private GuoDi guodi;
- public FoodDecorator(GuoDi guodi) {
- super();
- this.guodi = guodi;
- }
- @Override
- public float cost() {
- return guodi.cost();
- }
- @Override
- public String name() {
- return guodi.name();
- }
- }
第四步: 定义具体的装饰者对象
- public class MaLaNiuRou extends PeiCai {
- public MaLaNiuRou(GuoDi guodi) {
- super(guodi);
- }
- @Override
- public float cost() {
- return super.cost()+46f;
- }
- @Override
- public String name() {
- return super.name()+"+ 麻辣牛肉";
- }
- }
- public class MaoDu extends PeiCai {
- public MaoDu(GuoDi guodi) {
- super(guodi);
- }
- @Override
- public float cost() {
- return super.cost()+30f;
- }
- @Override
- public String name() {
- return super.name()+"+ 大刀毛肚";
- }
- }
测试类:
- public class Test {
- public static void main(String[] args) {
- GuoDi guodi = new DaLongYan(); // 点个大龙燚火锅原味锅底
- MaLaNiuRou y = new MaLaNiuRou(guodi); // 来个麻辣牛肉
- MaoDu x = new MaoDu(y); // 在麻辣牛肉的基础上再来个大刀毛肚
- System.out.println("一共点了" + x.name() + ", 共消费" + s.cost());
- }
- }
输出结果:
1 一共点了大龙燚火锅原味锅底 + 麻辣牛肉 + 大刀毛肚, 共消费 135
来源: http://www.phperz.com/article/18/0206/359290.html