简单说说装饰模式

这里只简单说说装饰模式,因为对这个模式理解得还不是很透彻。暂时不能写出更深一点的内容。

什么是装饰模式呢?拟定一个场景,一个人需要穿衣打扮,我们可以写一个Person类,为它定义出N个方法,穿短袖,穿皮鞋,等等。要新增一个装饰的时候,我们在Person类里新增一个方法即可,但这违背了“方法-封闭”原则。如何写出更好更加灵活的代码呢?我们用装饰模式来实现这个场景。小明先穿短袖,后穿皮鞋。

穿短袖、穿皮鞋等等,我们把这些装饰方法干脆抽象出来成一个装饰类,不同的装饰继承实现这个类。人定义为一个接口,小明是一个具体的人继承“人”接口。同时装饰类聚合并且实现“人”接口,这点也是我暂时没法深入理解的问题所在。有点绕口,我们还是先画出UML类图。

清楚类结构后,我们照着类结构来实现代码。

首先定义Component抽象构件(装饰类装饰的是抽象构件)接口。

 1 package day_6_decorator;
 2
 3 /**
 4  * 抽象构件
 5  * @author turbo
 6  *
 7  * 2016年9月9日
 8  */
 9 public interface Component {    //人
10     void operation();
11 }

实现这个Component抽象构件,创建一个ConcreteComponent具体构件。

 1 package day_6_decorator;
 2
 3 /**
 4  * 具体构件
 5  * @author turbo
 6  *
 7  * 2016年9月9日
 8  */
 9 public class ConcreteComponent implements Component {    //小明
10
11     /* (non-Javadoc)
12      * @see day_6_decorator.Component#Operation()
13      */
14     @Override
15     public void operation() {
16         System.out.println("具体对象的操作");
17     }
18
19 }

定义装饰类。

 1 package day_6_decorator;
 2
 3 /**
 4  * 装饰类
 5  * @author turbo
 6  *
 7  * 2016年9月9日
 8  */
 9 public class Decorator implements Component {
10     private Component component;
11
12     public void setComponent(Component component) {
13         this.component = component;
14     }
15     /* (non-Javadoc)
16      * @see day_6_decorator.Component#Operation()
17      */
18     @Override
19     public void operation() {
20         if (component != null){
21             component.operation();
22         }
23     }
24
25 }

定义具体装饰类ConcreteDecorateA。

 1 package day_6_decorator;
 2
 3 /**
 4  * 具体装饰类A
 5  * @author turbo
 6  *
 7  * 2016年9月10日
 8  */
 9 public class ConcreteDecoratorA extends Decorator {
10     private String addedState;    //本类独有功能
11
12     @Override
13     public void operation() {
14         super.operation();
15         addedState = "new State";
16         System.out.println("穿短袖");
17     }
18
19 }

定义具体装饰类ConcreteDecorateB。

 1 package day_6_decorator;
 2
 3 /**
 4  * 具体装饰类B
 5  * @author turbo
 6  *
 7  * 2016年9月10日
 8  */
 9 public class ConcreteDecoratorB extends Decorator {
10
11     @Override
12     public void operation() {
13         super.operation();
14         addedBehavior();
15     }
16
17     /**
18      *
19      */
20     private void addedBehavior() {
21         System.out.println("穿皮鞋");
22     }
23
24 }

客户端代码。

 1 package day_6_decorator;
 2
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月10日
 7  */
 8 public class Main {
 9
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         ConcreteComponent c = new ConcreteComponent();
15         ConcreteDecoratorA d1 = new ConcreteDecoratorA();
16         ConcreteDecoratorB d2 = new ConcreteDecoratorB();
17
18         d1.setComponent(c);
19         d2.setComponent(d1);
20         d2.operation();
21     }
22
23 }

输出结果。

这样我们就用两个装饰类对小明做了装饰,并且可以随意调换装饰的顺序。暂时还不能深入地聊下装饰模式,待我理解比较透彻再来深入理解下,不过这个装饰模式好像和Java的动态代理机制倒是有几分相似。同样在之后也会仔细研究研究。

时间: 2024-12-15 06:59:55

简单说说装饰模式的相关文章

swift设计模式学习 - 装饰模式代码大全

装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰模式的特点 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. 装饰对象包含一个真实对象的引用(reference) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. 装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能.在面向对象的设计中

swift设计模式学习 - 装饰模式

移动端访问不佳,请访问我的个人博客 装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰模式的特点 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. 装饰对象包含一个真实对象的引用(reference) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. 装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定对象的结构就可以在外

设计模式:代理模式与装饰模式

1.装饰者模式与代理模式 (静态代理) 在日常开发里面,我们经常需要给某个类的方法增加加某些特定的功能. 例如:有婴儿,婴儿会吃饭和走动,如以下类 1 package com.scl.designpattern.proxy; 2 3 //婴儿类 4 public class Child implements Human 5 { 6 public void eat() 7 { 8 System.out.println("eat something...."); 9 } 10 11 @Ov

Java:IO系统与装饰模式

Java的IO流有三种分法: ①输入流.输出流:输入输出流都是以Java程序为参照的. ②字节流.字符流:字节是存储单位,占8位,其他基本数据类型都用字节来衡量大小.字符是数字字母等字符,ASCII和Unicode都是字符编码集,ASCII码是8位一个字节的,Unicode是16位两个字节的,而Java字符编码是采用Unicode的.字节流后缀是Stream,字符流后缀是Reader,Writer. ③节点流.处理流:节点流可以理解为真正处理数据的流,处理流是在节点流的基础上的修饰. 关于各种流

系统架构师-基础到企业应用架构-服务层

一.上章回顾 上篇我们主要讲解了系统架构中的四种架构模式,并且分析了四种架构模式的实现及应用场景,那么先来回顾下架构中的业务逻辑层的使用及总结.  如果大家对图中讲述的内容不明白或者说是不深入那么可以参考上篇讲 解的内容:系统架构师-基础到企业应用架构-业务逻辑层. 二.摘要 本文将已架构的方式去分析分层结构中的服务层的设计,如何设计出来满足我们说的业务需求及设计规范的服务层将是我们的目标,可能我想大家在项目架构的 过程中可能有些同仁,没有用到该层,或者说是采用的是常用的分层结构的设计,而没有把

设计模式——结构模型

上一页博文<设计模式--创建型模式>中介绍了5种创建型模式.接下来继续介绍结构型模式. 结构型模式主要用于描写叙述怎样组合类和对象已获得更大的结构.当中.结构型类模式採用继承机制来组合接口和实现,而结构型对象模式则採用组合/聚合方式来组合对象以实现新功能,由于它能够在执行时刻改变对象组合关系.所以对象组合方式具有更大的灵活性,这样的机制是无法通过静态类组合来实现的. 当然两者都有彼此擅长之处,详细的取舍须要依据实际的应用场景而定. 结构型模式包含7种:适配器模式(Adapter).装饰模式(D

详细解剖大型H5单页面应用的核心技术点

阐述下项目 Xut.js 开发中一个比较核心的优化技术点,这是一套平台代码,并非某一个插件功能或者框架可以直接拿来使用,核心代码大概是6万行左右(不包含任何插件) .这也并非一个开源项目,不能商业使用,只是为了作者开发方便同步修改代码而上传的源码 描述下,项目提出的概念“无需程序员编程”可批量制作app应用.分2大块,1块是客户端(PPT),默认扩展插件提供用户编辑的界面,平台会把设计逻辑与界面数据编译成前端数据资源包(前端能处理的js.css.图片等资源了),另一个大块就是纯前端部分(Xut.

iOS设计模式 - 装饰

原理图 说明 1. cocoa框架本身实现了装饰模式(category的方式实现了装饰模式) 2. 装饰模式指的是动态的给一个对象添加一些额外的职责,相对于继承子类来说,装饰模式更加灵活 *3. 本人仅仅实现了最简单的装饰模式,装饰器类是一个具体的类,非抽象类 源码 https://github.com/YouXianMing/DecoratorPattern // // GamePlay.h // DecoratorPattern // // Created by YouXianMing on

Spring 源码解析之DispatcherServlet源码解析(五)

Spring 源码解析之DispatcherServlet源码解析(五) 前言 本文需要有前四篇文章的基础,才能够清晰易懂,有兴趣可以先看看详细的流程,这篇文章可以说是第一篇文章,也可以说是前四篇文章的的汇总,Spring的整个请求流程都是围绕着DispatcherServlet进行的 类结构图 根据类的结构来说DispatcherServlet本身也是继承了HttpServlet的,所有的请求都是根据这一个Servlet来进行转发的,同时解释了为什么需要在web.xml进行如下配置,因为Spr