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

  • 相关阅读:
    常用正则表达式
    C# 计算时间差 用timespan函数
    SQL Server日期时间格式转换字符串详解
    .net数据根据字段进行分类(linq语句)
    IIS设置允许下载.exe文件解决方法
    IIS 添加mime 支持 apk,exe,.woff,IIS MIME设置 ,Android apk下载的MIME 设置 苹果ISO .ipa下载mime 设置
    高版本jQuery设置checkbox状态注意事项
    sql大小转换函数
    常用的正则验证
    position布局影响点击事件以及冒泡获取事件目标
  • 原文地址:https://www.cnblogs.com/silenceshining/p/10539862.html
Copyright © 2011-2022 走看看