zoukankan      html  css  js  c++  java
  • 设计模式之装饰者模式-以牛肉面为例

    HeadFirst 设计模式中对装饰者模式的定义:

    装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案。

    以下是HeadFirst 设计模式中关于装饰者模式的类图:

    1、有一个抽象的组件(面条)。

    2、有具体的组件实现(牛肉面、鸡蛋面)。

    3、有进行装饰的类(加鸡蛋、加香肠,并且持有组件)。

    示例代码如下:

    组件基类(面条)

    package iodemo;
    
    /**
     * 
     * 面条基类
     */
    public abstract class Noodle {
    
        public abstract int cost();
    
    }

    组件实现(牛肉面、鸡蛋面)

    package iodemo;
    
    /**
     * 牛肉面(一种具体的面条)
     *
     */
    public class NiuRouNoodle extends Noodle {
    
        @Override
        public int cost() {
            System.out.println("牛肉面5元一碗");
            return 5;
        }
    }
    package iodemo;
    
    /**
     * 刀削面(一种具体的面条)
     *
     */
    public class DaoXiaoNoodle extends Noodle {
    
        @Override
        public int cost() {
            System.out.println("刀削面3元一碗");
            return 3;
        }
    
    }

    进行装饰的类(加鸡蛋、加香肠,并且持有组件)

    package iodemo;
    
    /**
     * 加鸡蛋(装饰)类,继承面条基类,对面条的方法进行包装,并且持有面条的引用
     *
     */
    public class JiDanDecoratorNoodle extends Noodle {
    
        private Noodle noodle;
    
        public JiDanDecoratorNoodle(Noodle noodle) {
            this.noodle = noodle;
        }
    
        @Override
        public int cost() {
            System.out.println("加鸡蛋1元");
            return this.noodle.cost() + 1;
        }
    
    }
    package iodemo;
    
    /**
     * 加(装饰)类,继承面条基类,对面条的方法进行包装,并且持有面条的引用
     * 
     * @author Administrator
     *
     */
    public class XiangChangDecoratorNoodle extends Noodle {
    
        private Noodle noodle;
    
        public XiangChangDecoratorNoodle(Noodle noodle) {
            this.noodle = noodle;
        }
    
        @Override
        public int cost() {
            System.out.println("加香肠2元");
            return this.noodle.cost() + 2;
        }
    
    }

    测试类

    package iodemo;
    
    public class Test {
    
        public static void main(String[] args) {
            //低配版牛肉面
            NiuRouNoodle niuRouNoodle=new NiuRouNoodle();
            System.out.println(niuRouNoodle.cost());
            System.out.println("***************");
            //中配版牛肉面(加鸡蛋)
            JiDanDecoratorNoodle jiDanDecoratorNoodle=new JiDanDecoratorNoodle(niuRouNoodle);
            System.out.println(jiDanDecoratorNoodle.cost());
            System.out.println("***************");
            //顶配版牛肉面(加鸡蛋加香肠)
            XiangChangDecoratorNoodle xiangChangDecoratorNoodle=new XiangChangDecoratorNoodle(jiDanDecoratorNoodle);
            System.out.println(xiangChangDecoratorNoodle.cost());
            
            
            
    
        }
    
    }

    运行结果如下:

    牛肉面5元一碗
    5
    ***************
    加鸡蛋1元
    牛肉面5元一碗
    6
    ***************
    加香肠2元
    加鸡蛋1元
    牛肉面5元一碗
    8

  • 相关阅读:
    Ext.window.Window在IE有部分半透明的问题
    匹配用户名的正则表达式
    PHP超时处理全面总结
    Extjs4 actioncolumn只能显示图标,不能显示文字的暂时解决方法
    SQL语句
    SQL Server 日期和时间函数
    asp.net 2.0中一次性更新所有GRIDVIEW的记录
    如何生成静态页面的五种方案[转]
    SQL IF..ELSE..在存储过程的使用规范
    数据库操作语句小结
  • 原文地址:https://www.cnblogs.com/silenceshining/p/10539862.html
Copyright © 2011-2022 走看看