博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式----装饰模式!
阅读量:6539 次
发布时间:2019-06-24

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

装饰模式:最简单的理解就是在你出门前,你需要对身先修饰一下,比如弄点胭脂,水粉啊,弄点好看的衣服啊。这就是装饰模式。

那么装饰模式用在什么地方呢。

可能很多人会觉得其实继承也能达到那样的效果。那么如果要我要装饰很多东西呢。什么耳环啊,什么胭脂啊,什么衣服啊,什么什么的。而且还是不一定每次都要这么多。

那你就去继承N个继承类么?这里主要是有存在装饰顺序问题,还是虽然装饰条件一样,但是可能某些需要装饰,某些条件不需要装饰。

如果用继承,那么就需要将所有的装饰条件都列举出来。比如5个条件吧。

那么装饰的可能就有:1,2,3,4,5,12,13,14,15,21,23,24,25......等等,很多。

但是用装饰就不同了。只需要5个条件。你可以去随意的组合。

那么这个时候装饰模式就来了。

首先看个例子。

你考试不及格。要去给家长看。那么正常你如果直接给你老爸看。那么我想一顿暴打不是可少的吧。至少是一顿痛骂吧。

那么现在看下成绩单,首先你得有一个试卷成绩接口吧:

package com.design.decorator;/**  * @ClassName:ISchoolreport  * @Description:试卷成绩接口。 * @author 
* @date 2012-12-15 上午10:09:16 * @version V1.0 */public interface ISchoolreport{ void report();}

 

实现类:

package com.design.decorator;/**  * @ClassName: FourthSchoolReport  * @Description:实现类。 * @author 
* @date 2012-12-15 上午10:12:13 * @version V1.0 */public class FourthSchoolReport implements ISchoolreport{ /* (非 Javadoc) *

Title: report *

Description: * @see com.design.decorator.ISchoolreport#report() */ @Override public void report() { System.out.println("成绩50"); } /* (非 Javadoc) *

Title: sign *

Description: * @see com.design.decorator.ISchoolreport#sign() */ @Override public void sign(String name) { System.out.println(name); } }

好吧如果就这样去给别人看,肯定是不行的。

所有这样咱先修饰修饰:

来一个修饰类:

package com.design.decorator;/**  * @ClassName: Decorator  * @Description:装饰类,这里必须要去继承 FourthSchoolReport 类或者实现 ISchoolreport接口. * 这样才能实现,被装饰过的类,还能再一次的被装饰。 主要为了保持装饰类和被装饰类来自同一个接口。 * @author 
* @date 2012-12-15 上午10:14:09 * @version V1.0 */public class Decorator implements ISchoolreport{ //成绩类 private ISchoolreport report; /** *@Description:构造方法。获取被修饰类。当然被修饰过的类也可以做为修饰类。这就是为什么Decorator要去继承修饰类或接口。 */ public Decorator(ISchoolreport report){ this.report = report; } public void report(){ this.report.report(); } public void sign(String name){ this.report.sign(name); }}

当然这只是一个父类。那么你具体想怎么样去修饰。就看个人能力了。毕竟每个人的能力不一样嘛。

看第一个孩子的修饰:

/**  * @ClassName: ScoreDecorator  * @Description:成绩装饰类,Decorator的子类。重写父类的方法。对被修饰类作出特定的修饰。 * @author 
* @date 2012-12-15 上午10:15:53 * @version V1.0 */public class ScoreDecorator extends Decorator{ /** *

Title:

*

Description:

* @param report */ public ScoreDecorator(ISchoolreport report) { super(report); } /** * @Description:修饰方法。 * */ public void showReport(){ System.out.println("总分就60分"); } /** * @Description:重写父类方法。添加自身修饰。 * **/ public void report(){ this.showReport(); super.report(); }}

这孩子就说总分就60分。那么别人看了肯定觉得你很不错了!对不。

 

看另外一个的修饰:

package com.design.decorator;/**  * @ClassName: SortDecorator  * @Description:排名修饰类。 * @author 
* @date 2012-12-15 上午10:24:33 * @version V1.0 */public class SortDecorator extends Decorator{ /** *@Description:构造方法。获取被修饰类。当然被修饰过的类也可以做为修饰类。这就是为什么Decorator要去继承修饰类或接口。 **/ public SortDecorator(ISchoolreport report){ super(report); } /** *@Description:修饰方示。 */ public void sortDecorator(){ System.out.println("排名低20"); } /** *@Description: 重写父类方法。 */ public void report(){ this.sortDecorator(); super.report(); }}

这个孩子说自己的班上排名20,那一样的肯定也不错了撒!

很好!

如果那天你想两个都装饰下,那也可以。

/**  * @ClassName: Client  * @Description:装饰模式客户端。 * @author 
* @date 2012-12-15 上午10:13:28 * @version V1.0 */public class Client { public static void main(String[] args) { //未装饰 ISchoolreport is = new FourthSchoolReport(); is.report(); //装饰一下 is = new ScoreDecorator(is); is.report(); is = new SortDecorator(is); is.report(); }}

这样两个都被你装饰上了。如果你还想修饰下,可以自忆再建个类就可以了!

转载于:https://www.cnblogs.com/yangzhi/archive/2012/12/15/3576591.html

你可能感兴趣的文章
实战CGLib系列之proxy篇(一):方法拦截MethodInterceptor
查看>>
php 字符串截取
查看>>
ttcn-3
查看>>
00.java虚拟机的基本结构概念
查看>>
意法半导体STM32芯片名称定义
查看>>
jsch密钥连接远程Linux报错com.jcraft.jsch.JSchException: invalid privatekey: [B@277050dc
查看>>
深入浅出 ES6:ES6 与 Babel - Broccoli 的联用
查看>>
ThreadLocal使用出现的问题
查看>>
SQLite数据库增删改查操作
查看>>
openwrt 常用命令
查看>>
桌面虚拟化最佳实践篇2—PCOIP协议详解及优化
查看>>
微软能重拾辉煌还是就此沉寂?
查看>>
我的友情链接
查看>>
rndc reconfig
查看>>
阿里巴巴理想主义者-厉建宇的离职信
查看>>
InnoDB存储引擎下快速创建索引
查看>>
关于IBM服务器引导盘安装提示硬盘小于8G报错
查看>>
php.ini配置文件详解
查看>>
linux sort命令参数及用法详解---linux将文本文件内容加以排序命令
查看>>
win7+ubuntu虚拟机之安装vmware tools步骤
查看>>