博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之装饰者模式-以牛肉面为例
阅读量:5098 次
发布时间:2019-06-13

本文共 2211 字,大约阅读时间需要 7 分钟。

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

 

转载于:https://www.cnblogs.com/silenceshining/p/10539862.html

你可能感兴趣的文章
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
backgound-attachment属性学习
查看>>
个人作业——关于K米的产品案例分析
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
java web 中base64传输的坑
查看>>
java 中的线程(一)
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
素数判断BFS之“Prime Path”
查看>>
Activiti入门 -- 环境搭建和核心API简介
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
Django中间件
查看>>
xcode 5.1安装vvdocument
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
MySQL更改默认的数据文档存储目录
查看>>
替代微软IIS强大的HTTP网站服务器工具
查看>>